这是一个基本的常见问题,我想一劳永逸地清除它。 (试了几天)
我有两种形式,位于主页上(控制器为static_pages_controller
)。
一种形式用于登录,另一种用于登录。
sign_in
表单使用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 :(得分:0)
当页面呈现时,HTML表单将有一个动作。您可以使用javascript更改表单的操作,具体取决于他们是注册还是登录。
答案 1 :(得分:0)
我认为这里存在一个小小的误解(或者我误解了你的问题)。您无法在form_field
中指定目标控制器和操作,至少不能直接指定。您唯一的责任是:
然后路径和控制器/动作之间的映射在routes.rb
中完成。例如:
resource :session, :only => [:new, :create, :destroy]
resources :users
这会生成以下路径=&gt;控制器/动作映射:
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 ...
因此,如果您需要将表单提交到会话#create,则网址必须为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 %>
由于您的表单看起来不错,因此问题的原因可能在routes.rb
。运行rake routes
以检查您的路线指向哪个控制器/操作。