我有index
显示两个表单的方法Sign in
,Sign up
这意味着用户可以从同一个地方创建一个帐户并登录。
所以我有users controller
一种index
方法可以显示视图,其中Sign in
包含Sign up
两个部分,一个是_signin.html.erb
和_signup.html.erb
in index.html.erb
。
任何想法我如何处理来自控制器的方法new
(可能我可以忽略新方法)?create
users
sessions
我有index
显示两个表单的方法Sign in
,Sign up
这意味着用户可以从同一个地方创建一个帐户并登录。
所以我有users controller
一种index
方法可以显示视图,其中Sign in
包含Sign up
两个部分,一个是_signin.html.erb
和_signup.html.erb
in index.html.erb
。
任何想法我如何处理来自控制器的方法new
(可能我可以忽略新方法)?create
users
sessions
只要每个表单都使用正确的模型对象和/或:url
选项的正确值呈现,每个表单都应该发送预期的请求(假设您使用 呈现表单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'
但是,如果您只想在index.html.erb
视图中显示这些表单,则不再需要这些路由。
<%= 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%>
我发现的一个简单解决方法是,如果两个表单至少有一个唯一命名的参数,那么您可以简单地将 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 请求来自两个表单所在的页面时,它将指向此控制器中的此操作。
希望这可以帮助!