0

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

我有两种形式,它们在主页上(谁的控制器是static_pages_controller)。一种用于登录,另一种用于注册。

sign_in表单使用usingsessions_controller动作create

sign_up表单使用usingusers_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")但似乎都没有。登录也一样。请帮忙!

4

2 回答 2

0

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

于 2012-07-10T10:40:39.443 回答
0

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

  • 为表单设置正确的URL(可以通过提供控制器和操作来生成,但这是另一回事)
  • 为表单设置正确的 HTTP方法(Rails 会自动执行此操作,如果没有,它将默认为 POST)

然后路径和控制器/动作之间的映射在routes.rb. 例如:

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 ...

因此,如果您需要将表单提交到 session#create,则 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 %>

由于您的表单看起来不错,因此您的问题的原因可能在于routes.rb. 运行rake routes以检查您的路由指向哪个控制器/操作。

于 2012-07-10T20:17:47.993 回答