在一个视图中导出多个表单

时间:2013-05-31 02:07:50

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

我有index方法显示两种格式Sign inSign up,这意味着用户可以在同一位置创建帐户和登录。

所以我使用users controller index方法显示带有Sign inSign up形式的视图,其中有两个部分,一个是_signin.html.erb和{{1} } _signup.html.erb

任何想法如何处理来自index.html.erbnew控制器的createusers方法(可能我可以忽略新方法)?

3 个答案:

答案 0 :(得分:4)

只要每个表单都使用正确的模型对象和/或:url选项的正确值进行渲染,每个表单都应发送预期的请求(假设您使用{{1 }})。

例如,您的登录表单应该以类似::

的方式开头
form_for

只要将<%= form_for :session, :url => sessions_path %> #... <% end %> 请求(表单提交的默认设置)发送到“集合”资源(即POST),它就会将请求路由到/sessions操作中你的create或你命名为控制器的任何东西。

要注册,您可能会遇到以下情况:

SessionsController

<%= 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' 视图中显示这些表单,则不再需要这些路径。

答案 1 :(得分: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%>

答案 2 :(得分: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请求打开两个表单时,它将指向此控制器中的此操作。

希望这有帮助!

相关问题