我有index
方法显示两种格式Sign in
和Sign up
,这意味着用户可以在同一位置创建帐户和登录。
所以我使用users controller
index
方法显示带有Sign in
和Sign up
形式的视图,其中有两个部分,一个是_signin.html.erb
和{{1} } _signup.html.erb
。
任何想法如何处理来自index.html.erb
和new
控制器的create
和users
方法(可能我可以忽略新方法)?
答案 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请求打开两个表单时,它将指向此控制器中的此操作。
希望这有帮助!