3

我有index显示两个表单的方法Sign inSign up这意味着用户可以从同一个地方创建一个帐户并登录。

所以我有users controller一种index方法可以显示视图,其中Sign in包含Sign up两个部分,一个是_signin.html.erb_signup.html.erbin index.html.erb

任何想法我如何处理来自控制器的方法new(可能我可以忽略新方法)?createuserssessions

4

3 回答 3

4

只要每个表单都使用正确的模型对象和/或:url选项的正确值呈现,每个表单都应该发送预期的请求(假设您使用 呈现表单form_for)。

例如,您的登录表单应以以下内容开头:

<%= form_for :session, :url => sessions_path %>
  #...
<% end %>

只要将POST请求(来自表单提交的默认值)发送到“集合”资源(即/sessions),它就会将请求路由到createSessionsController或您命名控制器中的操作。

对于注册,您可能有这样的事情:

<%= form_for @user do |f| %>
  # ...
<% end %>

模型对象将@user假定请求应该转到/users。这将再次调用您createUsersController.

当然,所有这一切也假设您的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视图中显示这些表单,则不再需要这些路由。

于 2013-05-31T03:41:28.127 回答
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%>
于 2013-05-31T04:59:48.227 回答
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 请求来自两个表单所在的页面时,它将指向此控制器中的此操作。

希望这可以帮助!

于 2015-09-04T18:19:02.813 回答