使用form_tag在主页上使用sign_in表单和sign_up表单

时间:2012-07-10 09:03:47

标签: ruby-on-rails forms

这是一个基本的常见问题,我想一劳永逸地清除它。 (试了几天)

我有两种形式,位于主页上(控制器为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也是如此。请帮忙!

2 个答案:

答案 0 :(得分:0)

当页面呈现时,HTML表单将有一个动作。您可以使用javascript更改表单的操作,具体取决于他们是注册还是登录。

答案 1 :(得分:0)

我认为这里存在一个小小的误解(或者我误解了你的问题)。您无法在form_field中指定目标控制器和操作,至少不能直接指定。您唯一的责任是:

  • 为表单设置正确的网址(通过提供控制器和操作可以生成,但这是一个不同的故事)
  • 为表单设置正确的HTTP 方法(Rails会自动执行此操作,如果没有,则默认为POST)

然后路径和控制器/动作之间的映射在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以检查您的路线指向哪个控制器/操作。

相关问题