轨在一个视图中的多个表单

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了轨在一个视图中的多个表单相关的知识,希望对你有一定的参考价值。

我有 index 显示两种形式的方法 Sign inSign up这意味着用户可以在同一个地方创建一个账户和登录。

所以我有 users controllerindex 的方法,显示一个带有 Sign inSign up 双主格 _signin.html.erb_signup.html.erbindex.html.erb.

任何想法,我怎么能处理 newcreate 方法从 userssessions 控制器(可能我可以忽略新方法)?

答案

只要每一个表单都是用正确的模型对象或正确的值来渲染的 :url 选项,每个表单都应该发送预期的请求(假设你的表单是用 form_for).

例如,你的签到表应该以这样的方式开始:。

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

只要是 POST 请求(表单提交的默认值)被发送到 "集合 "资源(即 /sessions),它将把请求路由到 create 在你 SessionsController 或任何你命名的控制器。

对于注册,你可能有这样的东西。

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

The @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

只要确保在你的路由.rb中配置好,当POST请求来自两个表单所在的页面时,它将直接指向这个控制器中的这个动作。

希望这能帮到你

以上是关于轨在一个视图中的多个表单的主要内容,如果未能解决你的问题,请参考以下文章

django 通用(类)视图中的多个表单类

单个视图中的多个表单

从单个按钮从多个片段中提取数据

Xamarin 表单 - 侧边菜单左侧栏、片段和列表视图

切换片段时如何维护子视图的状态?

轨道应用程序。设计视图中的多个表单