【问题标题】:Rails dynamic form issueRails动态表单问题
【发布时间】:2016-06-22 12:28:25
【问题描述】:

我正在开发基于http://railscasts.com/episodes/197-nested-model-form-part-2 的动态表单。

我有这个链接: 意见/共享/_new_field.html.erb

<%= link_to_add_fields "Add Field", f, :application_fields, @current_section.id %>

这里是: helpers/application_helper.rb

# Generates a link_to add a new application field.
def link_to_add_fields(name, f, association, section_id) 
    new_object = f.object.send(association).klass.new
    id = new_object.object_id
    fields = f.fields_for(association, new_object, child_index: id) do |builder|
        render(association.to_s.singularize + "_fields", f: builder) 
    end
    link_to(name, '#', class: "add_fields buttonS bBlue button", data: {id: id, fields: fields.gsub("\n", ""), section_id: section_id})
end

它会生成一个表单,当我填写字段并提交时,它会生成 params 哈希:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"Cl8XQNZeKRMtpdE0MLNhEX3by67bEcntjaAxygsduyo=", "application"=>{"application_fields_attributes"=>{"1380071101589"=>{"field_name"=>"RRR", "field_type"=>"textfield", "required"=>"0", "_destroy"=>"false"}}}, "commit"=>"Create", "id"=>"1", "section_id"=>"2"}

这是控制器方法:

...
@application = current_company.applications.find(params[:id])
@application.update_attributes(params[:application])

if @application.update_attributes(params[:application])
...

问题

使用我当前的控制器方法,它不会将 section_id 保存到 ApplicationField 行。

I also tried this in my controller method:
...
@application = current_company.applications.find(params[:id])
@application.assign_attributes(params[:application])
@application.section_id = params[:section_id]

if @application.save
...

但这会产生错误:

NoMethodError - undefined method `section_id=' for #<Application:0x007f8300138ca8>

我不知道我需要做什么才能将部分 id 保存到 ApplicationField 行。

参考模型

class Application < ActiveRecord::Base
    belongs_to :company
    has_many :application_fields, :dependent => :destroy
    accepts_nested_attributes_for :application_fields, :allow_destroy => true
    attr_accessible :application_name, :company_id, :application_fields_attributes
end

class ApplicationField < ActiveRecord::Base
    belongs_to :application
    has_many :application_fields_values, :dependent => :destroy
    attr_accessible :field_name, :field_type, :xposition, :yposition, :required, :application_id, :template_id, :options, :section_id 
end

辅助方法中 field.inspect 的输出:

"<div class=\"application_field formRow add_fields_form\" id=\"new_application_field\" remote=\"true\">\n    \n    <div class=\"formRow\">\n\t    <label for=\"application_application_fields_attributes_70100276854720_field_name\">Field name</label>\n\t    <input id=\"application_application_fields_attributes_70100276854720_field_name\" name=\"application[application_fields_attributes][70100276854720][field_name]\" size=\"30\" type=\"text\" />\n\t</div>\n    \n    <div class=\"formRow\">\n\t    <label for=\"application_application_fields_attributes_70100276854720_field_type\">Field type</label>\n\t    <select class=\"select\" id=\"field_type_dropdown\" name=\"application[application_fields_attributes][70100276854720][field_type]\"><option value=\"textfield\">Textfield</option>\n<option value=\"checkbox\">Checkbox</option>\n<option value=\"dropdown\">Dropdown</option>\n<option value=\"biglabel\">Big Label</option>\n<option value=\"smalllabel\">Small Label</option></select>\n\t</div>\n    \n    <div class=\"formRow\">\n\t    <input name=\"application[application_fields_attributes][70100276854720][required]\" type=\"hidden\" value=\"0\" /><input class=\"check\" id=\"application_application_fields_attributes_70100276854720_required\" name=\"application[application_fields_attributes][70100276854720][required]\" type=\"checkbox\" value=\"1\" />\n\t    <label for=\"application_application_fields_attributes_70100276854720_required\">Required</label>\n\t</div>\n    \n    <!-- Need to store the hidden field _destroy here so we can access it via jQuery -->\n    <input id=\"application_application_fields_attributes_70100276854720__destroy\" name=\"application[application_fields_attributes][70100276854720][_destroy]\" type=\"hidden\" value=\"false\" />\n    \n    <div class=\"grid1\" align=\"center\">\n        \n    </div>\n    \n    <div id=\"new_field_buttons\" class=\"formRow\">\n        <div id=\"new_field_buttons\" class=\"fluid sideWidget\">\n            <div class=\"grid6\">\n                <input class=\"buttonS bBlue\" name=\"commit\" type=\"submit\" value=\"Create\" />\n            </div>\n            <div class=\"grid6\">\n                <input id=\"cancel_new_field\" class=\"buttonS bRed\" type=\"button\" value=\"Cancel\">\n            </div>\n        </div>\n    </div>\n    <div class=\"clear\"></div>\n</div>\n"
ributes][70100276854720][_destroy]\" type=\"hidden\" value=\"false\" />\n    \n    <div class=\"grid1\" align=\"center\">\n        \n    </div>\n    \n    <div id=\"new_field_buttons\" class=\"formRow\">\n        <div id=\"new_field_buttons\" class=\"fluid sideWidget\">\n            <div class=\"grid6\">\n                <input class=\"buttonS bBlue\" name=\"commit\" type=\"submit\" value=\"Create\" />\n            </div>\n            <div class=\"grid6\">\n                <input id=\"cancel_new_field\" class=\"buttonS bRed\" type=\"button\" value=\"Cancel\">\n            </div>\n        </div>\n    </div>\n    <div class=\"clear\"></div>\n</div>\n"
             <input class=\"buttonS bBlue\" name=\"commit\" type=\"submit\" value=\"Create\" />\n            </div>\n            <div class=\"grid6\">\n                <input id=\"cancel_new_field\" class=\"buttonS bRed\" type=\"button\" value=\"Cancel\">\n            </div>\n        </div>\n    </div>\n    <div class=\"clear\"></div>\n</div>\n"
div class=\"clear\"></div>\n</div>\n"

【问题讨论】:

  • 只是一个猜测,没有深入挖掘。 section_id 似乎在基本参数哈希中,而不是 application_fields_attributes 哈希的一部分。因此,要么将其添加到帮助程序中的 fields 块中,要么在控制器中以 params[:section_id] 的形式访问它。该错误本质上是说应用程序没有该方法/字段。
  • 我尝试将它添加到控制器并使用assign_attributes,然后手动添加它,正如您在我的第二个控制器sn-p中看到的那样,但它是将它保存到Application而不是@ 987654337@。您能否详细说明如何将其添加到 fields 块或帮助我修复我的第二个控制器 sn-p 以将其添加到 ApplicationField
  • 您似乎正在尝试将 ApplicationField 属性分配给控制器中的 Application 对象。控制器的倒数第二行,您有@application.section_id = ...,但根据您的模型,该对象类不包含该方法。会这样吗?
  • @Teeg 是的,这就是我的控制器方法的第二个版本不起作用的原因,但我不明白 @application.update_attributes(params[:application]) 如何创建 ApplicationField 记录所以我不知道如何将params[:section_id] 添加到其中。
  • 也许在帮助程序中的块之后和link_to 调用之前尝试fields[:section_id] = section_id

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

不要将section_id 传递给link_to 方法,而是尝试将其作为变量传递给render 方法,如下所示:

render(association.to_s.singularize + "_fields", f: builder, section_id: section_id)

这样,您只需在 application_field_fields 部分中插入一个隐藏字段,将section_id 添加到发布到控制器的表单数据中:

<%= f.hidden_field :section_id, :value => section_id %>

【讨论】:

    猜你喜欢
    • 2017-01-11
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多