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

时间:2013-12-12 09:01:26

标签: ruby-on-rails ruby ruby-on-rails-3 nested hidden-field

我在视图中有以下代码:

    <% @m1.map(&:id).each do |id|%>

    <%= b.fields_for :modul1hours do |f| %>

    <%= f.hidden_field :modul1_id, id %>
    <%= f.text_field :module_est_hours, :size => 30 %>
    </tr>
  <% end %>

<%end%>

在控制台中传递的参数

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)是一个人可以在控制台参数module_est_hours"=>"3中看到的传递,但是休息的两个字段y没有通过,并且解决了错误。请帮帮我。

修改1

    <% @m1.map(&:id).each do |id|%>

    <%= b.fields_for :modul1hours do |f| %>

    <%= hidden_field_tag "modul1_ids[]", id %>
    <%= f.text_field :module_est_hours, :size => 30 %>
    </tr>
  <% end %>

<%end%>

此代码不提供错误,但值也未存储在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中未保存在表中?

视图

    <%= form_for @esthour,:rfp_id => @rfp.id,:project_id => @project do |b| %>

    <%= b.hidden_field :rfp_id, :value => @rfp.id %>

    <%= hidden_field_tag :project_id, @project %>
   <table>
      <tr>    <td><b>Menutype </b></td>
    <% if  @rfp.menutype.present? %>
        <td><%= @rfp.menutype %></td> 
        <td><%= b.number_field :menutype_est_hours %></td>
    <% end %>
</tr>

      <tr>           <td> <b>Number of menu</b> </td>
    <% if  @rfp.numberofmenu.present? %>
        <td><%= @rfp.numberofmenu %></td> 
        <td><%= b.number_field :numberofmenu_est_hours %></td>
    <% end %>
   </tr>

    <tr>

        <% @m1.map(&:id).each do |id|%>

         <%= b.fields_for :modul1hours do |f| %>


          <%= f.hidden_field :modul1_id, value => id  %>
          <%= f.text_field :module_est_hours, :size => 30 %>
         </tr>
      <% end %>

     <% end %>



      </table>
     <%= b.submit 'Add Todo' %>
     <% end %>


     @esthour = Esthour.new

         @gg =  @esthour.modul1hours.build
       @project = params[:project_id]

2 个答案:

答案 0 :(得分:3)

在这一行:

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

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

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

答案 1 :(得分:1)

隐藏字段不是真正的问题

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


嵌套模型

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

从您的控制器代码中,我无法看到您如何处理额外数据,但您的错误是由错误的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功能。

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

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

你的问题是,你正在循环浏览modul1hours模型的ID,人为地产生f.fields_for。如果在控制器中构建了ActiveRecord对象,Rails只会输出f.fields_for

             “30”%&gt;   

This 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替换为

的项目has_many