在嵌套模型轨道中传递数组隐藏字段

我在视图中有以下代码:

    30 %>    

在控制台中传递的参数

 Parameters: {"authenticity_token"=>"LJ/ZME2lHZ7VwCDgPKX6OFe326fXSXo5UB4M0cPwbCE=", "esthour"=>{"rfp_id"=>"6", "ecommerce_est_hours"=>"", "modul1hours"=>{"module_est_hours"=>"3"}, "designpages_est_hours"=>"", "cms_est_hours"=>""}, "modul1_ids"=>["12", "13", "14"], "utf8"=>"✓", "project_id"=>"second", "commit"=>"Add Todo"} 

当前用户:admin(id = 1)

modul1_ids是基于创建三个文本框的隐藏数组,但是当我提交页面时,我给出了:

 ActionView::Template::Error (undefined method `merge' for 12:Fixnum): 

在第一个文本框中,我通过1秒2和第三个3

最后一个值(3)是一个人可以在控制台中看到的参数params module_est_hours"=>"3 ,但是rest的两个字段y没有通过什么,并且解决了错误的解决方案。 请帮我。

编辑1

      30 %>    

此代码不会给出错误,但值也不会存储在modul1hours表中

modul1hours表的字段是:

 integer :modul1_id decimal :module_est_hours decimal :module_act_hours integer :esthours_id 

]

.RB

belongs_to:esthour

attr_accessible:module_est_hours,:module_act_hours

和控制器

更新

  def new @esthour = Esthour.new @gg = @esthour.modul1hours.build @project = params[:project_id] @rfp = params[:rfp_id] @m1 = Modul1.where(:rfp_id => @rfp.id) respond_to do |format| format.html # new.html.erb format.json { render :json => @esthour } end 

更新 #GET / project_todos / 1 / edit

  def edit @esthour = Esthour.find(params[:id]) end def create @project = params[:project_id] @esthour = Esthour.new(params[:esthour]) user_params = params.select{|k,v| k.include?('esthour')} respond_to do |format| if @esthour.save get_issue_attribute_param1(user_params) format.html { redirect_to project_rfp_url(@project,@esthour.rfp_id), :notice => 'hours was successfully created.' } format.json { render :json => @esthour, :status => :created, :location => @esthour } else format.html { render :action => "new" } format.json { render :json => @esthour.errors, :status => :unprocessable_entity } end end end 

是否需要任何构建?例如Esthour.modul1hour.build在控制器coz记录的新def中没有保存在表中?

视图

   @rfp.id,:project_id => @project do |b| %>  @rfp.id %>      id %>  30 %> 
Menutype
Number of menu
@esthour = Esthour.new @gg = @esthour.modul1hours.build @project = params[:project_id]

隐藏的字段不是真正的问题

除了@ BroiStatse的答案,我可以看到你如何处理控制器上的参数问题


嵌套模型

将数据发送到控制器会将该数据发送到相关模型。 这通常使用accepts_nested_attributes_for处理,但也可以手动处理

从你的控制器代码,我看不出你是如何处理你的额外数据,但你的错误是由params的不正确merge引起的

我不会手动保存数据,而是使用accepts_nested_attributes_for来保存数据,如下所示:

 #app/models/project.rb Class Project < ActiveRecord::Base accepts_nested_attributes_for :modul1hours end 

这会将params传递给你的modul1hours模型,然后你必须使用相关的attr_accessible动作捕获它们


f.fields_for

为了使accepts_nested_attributes_for正常工作,您必须确保正确使用f.fields_for函数。

您必须首先在new控制器操作中build ActiveRecord对象,如下所示:

 def new @project = Project.new @project.modul1hours.build end 

你的问题是,然后你骑自行车穿过你的modul1hours模型的ID,人工产生f.fields_for 。 如果在控制器中构建了ActiveRecord对象,Rails将仅输出f.fields_for

“30”%>

这个RailsCast可以让您更好地了解这一点

我要做的是:

 #app/controllers/projects_controller.rb def new @project = Project.new @m1.map(&:id).each do |i| @project.modul1hours.build end end #app/views/projects/new.html.erb <%= b.fields_for :modul1hours do |f| %> <%= hidden_field_tag :id, value :id %> <%= f.text_field :module_est_hours, :size => "30" %> <% end %> 

我还在考虑如何将ID分配给隐藏字段


更新

试试这个:

 #app/controllers/projects_controller.rb def new @project = Project.new @project.modul1hours.build end 

用你的任何项目替换modul1hours

在这一行:

 <%= f.hidden_field :modul1_id, id %> 

你说你想要隐藏的字段与modul1hour modul1_id方法绑定,选项是id 。 FormBuilder hidden_​​field的第二个参数应该是一个哈希值(然后根据默认选项合并)。 做你想做的事:

 <%= f.hidden_field :modul1_id, value: id %>