Rails一个视图中有多个表单

3
我有一个名为“index”的方法,用于显示两个表单:注册和登录。这意味着用户可以从同一位置创建帐户并登录。
所以我有一个“users控制器”,其中包含“index”方法,可以显示带有“注册”和“登录”表单的视图,并使用两个局部文件之一“_signin.html.erb”和“_signup.html.erb”在“index.html.erb”中。
您有什么想法如何处理来自“users”和“sessions”控制器的“new”和“create”方法(也许我可以忽略“new”方法)?

你还在遇到这个问题吗?我问这个是因为你拒绝了我的答案。 - James
@amesee - 请查看http://www.reddit.com/的注册页面,登录和注册在同一页上,我正在寻找类似的东西。 - AMIC MING
这只是在同一页上显示两个表单的问题。一个用于登录,另一个用于注册,每个表单分别发送请求到sessions/createusers/create。本页上的两个答案基本上解释了如何做到这一点。你是不是对Rails不够熟悉,无法理解这个问题?我的意思是,用户认证和用户创建的问题在几乎所有介绍Rails的书籍和教程中都已经得到了解决。 - James
3个回答

4
只要每个表单都使用正确的模型对象和/或正确的值呈现到:url选项中,每个表单都应该发送预期的请求(假设您使用form_for呈现表单)。
例如,您的登录表单应该像这样开始:
<%= form_for :session, :url => sessions_path %>
  #...
<% end %>

只要向“collections”资源(即/sessions)发送POST请求(表单提交的默认值),它就会将请求路由到SessionsController的create操作或其它您命名的控制器。对于注册,您可能有类似以下内容的代码:
<%= form_for @user do |f| %>
  # ...
<% end %>

@user模型对象将默认请求发送到/users。同样,这将调用您的UsersController中的create动作。

当然,所有这些也假设您的config/routes.rb文件只是声明每个资源,例如:

resources :users
resources :sessions, :only => [:create, :destroy]

通常情况下,每个表单都会有单独的视图,例如:

match 'sign_in', :to => 'sessions#new'
match 'sign_up', :to => 'users#new'

但是,如果你只想在index.html.erb视图中显示这些表单,那么这些路由就不再必要了。


3
<%= form_for :signin,:url=>{:controller=>"yourcontroller",:action=>"signin"},:html=>{:id=>"signin_form"} do |f|%>
  ...
<%end%>

<%= form_for :signup,:url=>{:controller=>"yourcontroller",:action=>"signup"},:html=>{:id=>"signup_form"} do |f|%>
...
<%end%>

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请求时,它将指向此控制器中的此操作。

希望这可以帮助到您!


我认为这是一个非常非常糟糕的想法:它非常不灵活,容易出错。 - Nikita Misharin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接