【问题标题】:Pass params between forms in the same view RoR在同一视图 RoR 中的表单之间传递参数
【发布时间】:2015-07-07 21:23:11
【问题描述】:

我在同一个视图中有两个表单 form_tag 和 form_for 。第一个(form_tag)使用它来实时搜索节点(父节点)。第二个(form_for)用它来创建一个节点(子节点)。更清楚地说,每个节点都有一个变量 (parent_id) 指向另一个节点(父节点)。

我的问题是,当我创建子节点(使用 form_for )时不知道如何分配值 parent_id ,因为我不知道如何将值从一种形式传递到另一种形式

new.html.erb

<%= form_tag ({controller: "nodes", action: "search"}), :id => "users_search" do %>
  <%= text_field_tag :search, params[:search], :autocomplete => 'off' %>
  <div id='users'>
    <%= render 'users' %>
  </div>
<% end %>

<%=form_for @node do |f| %>
  <%= f.hidden_field :parent_id, :value => @nodo_padre %>
  <%= f.hidden_field :user_id, :value => current_user.id  %>
  <%= f.hidden_field :ocuped, :value => true %>
  <%= f.text_field :custom_node_name %>
  <%= f.check_box :terms_of_service,{}, true,false %>
  <%= f.submit "Pagar", class: "button postfix" %>
<% end %>

_users.html.erb

<% if not @parent.nil? %>
  <% @parent.each do |u| %>
    <%= u.user.email %>
    <%= hidden_field_tag @nodo_padre , u.id %> ...... i think...
<% end %>

请求

参数:

{"utf8"=>"✓",
 "authenticity_token"=>"nz7hu0sBrv49b2AY/Rw0C6NAK8dNo4ra7YkM5VAL0q+0D9yFsa5/pO3bOOuuXxx+K04MP5dZHNOJzanDToYOmw==",
 "node"=>{"parent_id"=>"",
 "user_id"=>"4",
 "ocuped"=>"true",
 "custom_node_name"=>"Mi primera red",
 "terms_of_service"=>"true"},
 "commit"=>"Pagar"}

nodes_controller.rb

def new
@node = Node.new   
end

def search
@node = Node.new  
@parent = Node.search(params[:search]).where(:ocuped => true)

if not @users.nil?
  if @users.count == 1
    @node_incomplete = @users.nodes.where(" sons < ? AND ocuped = ?",2,true).first
  else
    @node_incomplete = @users.first.nodes.where(" sons < ? AND ocuped = ?",2,true).first
  end
  @son_of_incompleted_node = @node_incomplete.children
end

respond_to do |format|
  format.html
  format.js { render }
end
end

def create
@node = Node.new(node_params)
@node.parent_id = @parent.id
respond_to do |format|
  if @node.save
    format.html { redirect_to @node, notice: 'Node was successfully created.' }
    format.json { render :show, status: :created, location: @node }
  else
    format.html { render :new }
    format.json { render json: @node.errors, status: :unprocessable_entity }
  end
end
end

【问题讨论】:

  • 如果您使用嵌套表单,则不必将值从一个控制器传递到另一个控制器。你熟悉accepts_nested_attributes_for吗?
  • 可以嵌套 form_tag 和 form_for 吗?我考虑过这个选项,但我没有找到该案例的文档。
  • 我不知道你是否可以在form_for中嵌套一个form_tag,但是我想知道你是否必须这样做,因为父节点和它的子节点都有一个关联的模型(意味着嵌套一个form_for子在 form_for 父级内很好)。更重要的是,我想知道嵌套表单是否在自引用关系中起作用。您的 node.rb 是否设置为 this?
  • 我的问题是我无法在 form_for 中运行 AJAX(实时搜索)。出于某种原因,它不适用于 form_for ,并且适用于 form_tag ,因此为避免出现重大问题,我不这样做。但是如果没有其他解决方案...
  • 你有&lt;%= f.hidden_field :parent_id, :value =&gt; @nodo_padre %&gt; 但@nodo_padre 来自哪里?您能否在模型中建立关系以允许 @node.parent 工作?

标签: ruby-on-rails ruby forms ruby-on-rails-4


【解决方案1】:

如何构建表单并不重要(form_for、form_tag、simple_form_for...)。这将在呈现的 html 模板中产生一个&lt;form&gt;。 它们“存在”在客户端(浏览器)上的那些表单。如果您提交表单,那么只有表单元素(&lt;input&gt;, &lt;textarea&gt;, &lt;select&gt; 等元素)会提交到服务器。

嵌套&lt;form&gt;标签是无效的,也就是说你不能在另一个&lt;form&gt;标签内有一个&lt;form&gt;标签。尽管在单个页面上有多个 &lt;form&gt; 标签是有效的。

当您想在&lt;form&gt; 元素之间共享信息时,您可以使用Javascript 将值从一个&lt;form&gt;“转移”到另一个。

假设你想知道提交第二个表单时的父节点id:

  • 在第一种形式的父节点id元素上注册一个更改监听器
  • 更改时,读取值,将其写入第二个表单的隐藏字段

假设您使用 jQuery:您可能会发现这很有用:https://api.jquery.com/change/

或者您可以在实时搜索中将父节点 ID 设置为隐藏字段。

无论如何:除非它存在于&lt;form&gt; 中,否则它不会被提交给服务器。所以解决方法是使用隐藏字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多