2013-05-31 30 views
2

我有index方法,它顯示兩種形式Sign inSign up,這意味着用戶可以創建一個帳戶並從同一地點登錄。在一個視圖中導軌多個表單

所以我有users controllerindex方法,該方法顯示與Sign inSign up形式的視圖具有兩個分音之一爲_signin.html.erbindex.html.erb_signup.html.erb

任何想法如何處理newcreate方法從userssessions控制器(可能我可以忽略新方法)?

+0

你還有這個問題嗎?詢問是因爲你不接受我的答案。 – veidt

+0

@amesee - 參見http://www.reddit。com/- 註冊頁面,都登錄並​​註冊在同一頁面上,我看起來像這樣 –

+0

這只是在同一頁面上顯示兩種表單的問題。一個用於登錄,另一個用於註冊,其中每個表單分別向'sessions/create'或'users/create'發送請求。這個頁面上的兩個答案都很好地解釋瞭如何做到這一點。你用鐵軌不夠熟悉這一點嗎?我的意思是用戶身份驗證和用戶創建的問題在幾乎所有關於rails書籍和教程的介紹中都得到了解決。 – veidt

回答

3

只要每個表格都使用正確的模型對象和/或:url選項的正確值進行呈現,則每個表單都應發送預期請求(假設您使用form_for呈現表單)。

例如,您的登錄表單應該像這樣開始::

<%= form_for :session, :url => sessions_path %> 
    #... 
<% end %> 

只要POST請求(從表單提交默認)發送到「收藏」資源(即/sessions )它會將請求路由到您的SessionsController中的create操作或任何您命名爲控制器的操作。

簽署了,你可能有這樣的事情:

<%= form_for @user do |f| %> 
    # ... 
<% end %> 

@user模型對象將承擔該請求應該去/users。再次,這會將您的create操作稱爲您的UsersController

當然,這一切還假設你config/routes.rb文件僅僅是聲明的每個資源的東西,如:

resources :users 
resources :sessions, :only => [:create, :destroy] 

您通常在諸如

match 'sign_in', :to => 'sessions#new' 
match 'sign_up', :to => 'users#new' 

但如果單獨視圖每個窗體您只想在index.html.erb視圖中顯示這些表單,那麼這些路由就不再需要了。

3
<%= form_for :signin,:url=>{:controller=>"yourcontroller",:action=>"signin"},:html=>{:id=>"signin_form"} do |f|%> 
    ... 
<%end%> 

<%= form_for :singup,:url=>{:controller=>"yourcontroller",:action=>"signup"},:html=>{:id=>"signup_form"} do |f|%> 
... 
<%end%> 
0

一個簡單的解決方法,我發現是,如果這兩種形式至少有一個唯一命名的參數,那麼你可以簡單地將POST請求一個動作。然後在動作中檢查哪個參數存在並執行相應的代碼。你最終在控制器的一個動作中實質上有兩個動作。

def create 
    if params[:username] and !params[:name] 
    # You know that the user pressed submit on whichever form 
    # has a field that fills params[:username]. 
    # So do the action with that form's parameters here 
    # i.e, login an existing user 

    respond_to do |format| 
     format.html {redirect_to '/home', notice: "Login successful"} 
    end 

    elsif params[:name] and !params[:username] 
    # You know that the user pressed submit on whichever form 
    # has a field that fills params[:username]. 
    # So do the action with that form's parameters here 
    # i.e, create a new user 

    respond_to do |format| 
     format.html {redirect_to '/onboard', notice: "Thanks for signing up"} 
    end 
    end 
end 

只要確保有它在你的routes.rb配置以便當POST請求來自網頁的兩種形式,它會直接在該控制器這個動作。

希望這會有所幫助!

+0

我認爲這是一個非常非常糟糕的主意:它非常不靈活,也容易出錯 –