2012-07-10 58 views
0

這是一個基本和常見的問題,我想清除它一勞永逸。 (試了幾天)sign_in表單和sign_up表單在主頁上使用form_tag

我有兩種形式,這是在主頁上(whos控制器是static_pages_controller)。 一種形式是用於登錄,另一種用於登錄。

0123'表格使用sessions_controller使用create操作。

sign_up窗體使用users_controller使用create操作。

當使用form_tag如何指定應該使用哪個控制器以及應採取什麼操作?

下面的代碼是註冊頁面: `

<%= form_tag(users_path) do%> 

<%= label_tag :name %> 
<%= text_field_tag :name %> 

<%= label_tag :email %> 
<%= text_field_tag :email %> 

<%= label_tag :password %> 
<%= password_field_tag :password %> 

<%= label_tag :password_confirmation, "Confirmation" %> 
<%= password_field_tag :password_confirmation %> 

<%= submit_tag "Create my account" , class: "btn btn-large btn-primary" %> 
<% end %>` 

我知道有像form_tag({:controller => "user", :action => "create"}, :method => "post", :class => "nifty_form")選項,但似乎沒有工作。相同的sign_in。請幫忙!

+0

你是什麼意思的「似乎沒有工作」?你的意思是說它太複雜了,不適合你的使用?或者你得到一個錯誤?因爲它在官方指南中說'form_tag'中的params散列版本生成一個form標籤。 – Kashyap 2012-07-10 10:44:47

+0

對不起,我應該澄清。沒有創建一個新的用戶。我得到的最好的是,它路由到註冊頁面,或得到一個路由錯誤,說'沒有路由匹配[POST]「/ assets」 – gothic12345 2012-07-11 05:46:36

+0

我也試過這個: '<% form_tag users_path,:method =>「post」do%>' 表單位於主頁。當我提交表單時,它會將我重定向到註冊頁面,並顯示所有錯誤消息,例如「名稱字段爲空」,儘管我正確填寫了原始表單。 – gothic12345 2012-07-11 08:27:32

回答

0

當頁面呈現時,HTML表單將會有一個動作。您可以使用javascript更改表單的操作,具體取決於他們是註冊還是登錄。

+0

必須有一個誤解。有兩種形式,所以不需要JavaScript。問題是有兩個獨立的控制器需要考慮。爲了登錄,Form1應該使用會話控制器。爲了註冊,Form2應該使用用戶控制器。 問題是如何具體說明窗體應該指向哪個控制器和模型。請注意,該表單位於主頁,其默認控制器是static_pages_controller。 – gothic12345 2012-07-11 03:43:23

0

我認爲這裏存在一個小小的誤解(或者我誤解了您的問題)。至少不能直接在form_field中指定目標控制器和操作。你唯一的責任存在於:

  • 設置形式正確URL(可通過提供一個控制器和一個動作產生,但是這是一個不同的故事)
  • 設置正確的HTTP 方法的形式(Rails的自動執行此操作,並且如果沒有,則默認爲POST)

然後路徑和控制器/動作之間的映射在完成。例如:

resource :session, :only => [:new, :create, :destroy] 
resources :users 

這將生成以下路徑=>控制器/動作映射:

GET /session/new => sessions#new  (new_session_path) 
POST /session  => sessions#create  (session_path) 
DELETE /session  => sessions#destroy 

GET /users/new => users#new    (new_user_path) 
POST /users  => users#create   (users_path) 
... etc ... 

所以,如果您需要提交表格#創建會話,URL必須session_path和該方法必須是POST。這同樣適用於users_path。 下面的代碼確實,對於符號形式:

<%= form_tag session_path do %> 
    <!-- fields --> 
<% end %> 

的註冊表單是有點不同,因爲這種形式是一個模型對象,這樣你就可以使用form_for(假設你有@new_user = User.new在您的控制器) :

<%= form_for @new_user do |f| %> 
    <%= f.label :name %> 
    <%= f.text_field :name %> 
    <!-- etc --> 
<% end %> 

由於您的形式看起來OK,你的問題的原因可能是routes.rb。運行rake routes以檢查您的路線指向哪個控制器/操作。

+0

我正在註冊兩個不同的模型。患者和醫生。我有一個人們可以選擇的形式的下拉列表,但還沒有弄清楚我如何通過這個路徑作爲路線的指示器來選擇它應該到哪個控制器。 (但那是另一個問題)。 在這裏,我試圖解決這個問題沒有選擇,只想簽署使用form_tag的人。 目前我正在嘗試使用此代碼。 '<%= form_tag({:controller =>「users」,:action =>「/ users」},:method =>「post」,:class =>「nifty_form」)do%>' 給我一個路線錯誤。什麼是行動和什麼方法? – gothic12345 2012-07-11 06:52:17

+0

在這裏,您正試圖通過爲其提供控制器和操作名稱來生成表單提交URL。但是_action_參數應該是目標Rails動作,而不是**進入_action_ HTML參數的值(它們具有相同的名稱,所以難怪它似乎令人困惑......)。因此,如果您在_UsersController#create_方法中創建用戶,那麼您的代碼應該如下所示:'{:controller =>「users」,:action =>「create」}'或者只是'users_path'。如果你的路由設置正確,它們都應該生成類似於此的HTML代碼:'

...' – 2012-07-13 20:09:01

+0

如果你仍然卡住,請添加你的路由。 rb'和你的問題的完整代碼,因爲我在這裏黑暗中刺傷... – 2012-07-13 20:12:47

相關問題