2013-06-05 59 views
0

我正在開發一個使用Ruby on Rails的小項目,基本上學生可以註冊一個書房。我有一個修改,我試圖使我還不知道。表單提交幫助

默認情況下,當我創建新的提交時,它會創建它並轉到基本顯示提交中的所有信息的視圖屏幕。這裏是表單控制器:

# POST /students 
# POST /students.json 
def create 
@student = Student.new(params[:student]) 

respond_to do |format| 
    if @student.save 
    format.html { redirect_to @student, notice: 'Student was successfully created.' } 
    format.json { render json: @student, status: :created, location: @student } 
    else 
    format.html { render action: "new" } 
    format.json { render json: @student.errors, status: :unprocessable_entity } 
    end 
end 
end 

我想要做的,當用戶點擊提交按鈕,它不會自動保存到數據庫的,而是它進入下一個屏幕,用戶可以查看他們的提交併通過點擊按鈕確認提交。一旦他們點擊確認按鈕,它應該將其保存到數據庫並顯示「學生已成功創建」。注意並將它們帶回窗體屏幕。

下面是展會的控制器(這是下一個頁面被顯示):

# GET /students/1 
# GET /students/1.json 
def show 
@student = Student.find(params[:id]) 

respond_to do |format| 
    format.html # show.html.erb 
    format.json { render json: @student } 
end 
end 

回答

2

一些要點:

  1. 不要使用#show顯示預覽。 #show應該顯示正常的持久對象,而你的新對象還沒有持久。預覽時還需要額外的元素,例如「確認」鏈接/按鈕。

  2. 最好使用單獨的#preview操作,該操作接受來自#new的表單提交,並將確認的對象發送到#create

  3. 您需要一輛車輛在#preview中傳遞對象,這兩者都強制(到#create)和返回(如果不滿意,則返回到#new)。雖然我不喜歡使用會話,但似乎沒有太多的選擇。

的示例代碼:

def new 
    @student = session[:student].blank? ? Student.new : session[:student] 
    # ... 
    render 
end 

def preview 
    @student = Student.new(params[:student]) 
    session[:student] = @student 
    # .... 
    render 
end 

def create 
    @student = session[:student] 
    session[:student].clear 
    # ... 
    render 
end 

添加

進一步瞭解#3。在#create中,你需要params來構建一個新的對象,並保存完整的數據。但是在這種情況下,表單不會提交到#create,而是#preview。那麼如何獲取數據呢?有三種方式:

a。平面顯示(就像#show)。在#preview中,使用#new發送的數據填充隱藏字段。

b。平原顯示。使用會話來傳遞數據而不是表單。比#a簡單多了。

c。在#preview中顯示純文本和表單。用戶可以預覽提交併在#preview中進行編輯。

根據您的需要,#b和#c都是很好的IMO。

+0

我應該提到我是Ruby on Rails的新手(我的第3天),並且還不理解所有的語法。我仍然在試圖弄清楚腳手架所做的所有動作。但我得到你說的,除了第3部分。 – Nick

+0

@尼克,別擔心,你會解決它。關於#3,我會添加更新。 –

+0

從理論上說,我明白你在說什麼,我已經玩過它,但似乎無法讓它工作。我不確定會議的工作方式,但這是我努力做到的。從#create我有用戶輸入沒有得到保存的數據。在他們輸入數據後,它被傳遞給#preview,它看起來像#show,顯示用戶信息。預覽包含兩個用於編輯的按鈕和一個用於確認的按鈕。編輯作品,但我無法確定。我再次理解它背後的理論,但不知道如何爲它提供語法代碼。希望這是有道理的。 – Nick