在同一视图RoR中的表单之间传递参数

时间:2015-07-07 21:23:11

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

我在同一视图中有两个表单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

1 个答案:

答案 0 :(得分:1)

如何构建表单无关紧要(form_for,form_tag,simple_form_for ...)。这将导致渲染的html模板中的<form>。 那些形式他们在客户端(浏览器)“活着”。如果您提交表单,则只有表单元素(如<input>, <textarea>, <select>之类的元素)被提交给服务器。

嵌套<form>代码无效,即您必须在另一个<form>代码中没有<form>代码。虽然在单个页面上有多个<form>标记,但它是有效的。

如果您想在<form>个元素之间共享信息,那么您可以使用Javascript将值从一个<form>“转移”到另一个<form>

假设您想在提交第二个表单时知道父节点ID:

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

假设你使用jQuery:你可能会觉得这很有用:https://api.jquery.com/change/

或者,您可以在实时搜索中选择父节点ID为隐藏字段。

在任何情况下:除非它出现在{{1}}中,否则它将不会提交给服务器。因此,解决方案是使用隐藏字段。