2013-09-25 6 views
0

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 %> 

: 도우미/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 

때 입력란을 작성하고 제출하면 매개 변수 해시가 생성됩니다.

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"} 
그것은 ApplicationField 행으로 section_id을 절약 아니에요, 내 현재의 컨트롤러 방법으로

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

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

문제점

:

는 그리고 이것은 컨트롤러 방법이다.

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> 

나는 내가 ApplicationField 행에 저장할 섹션 ID를 얻기 위해해야 ​​할 것에 대해 손실에 있어요. 도우미 방법에 field.inspect의 참조를 들어

모델

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 

출력 :

"<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" 
+0

을 너무 깊이 파고없이. 'section_id'는 기본 params 해시에 있고 'application_fields_attributes' 해시의 일부가 아닙니다. 그러므로 헬퍼의'fields' 블록에 추가하거나 컨트롤러에서'params [: section_id]'로 접근하십시오. 오류는 본질적으로 응용 프로그램에 해당 메소드/필드가 없다는 것을 말합니다. – Brian

+0

컨트롤러에 추가하고 assign_attributes를 사용하고 두 번째 컨트롤러 스 니펫에서 볼 수있는 것처럼 수동으로 추가하려고 시도했지만 'ApplicationField'가 아닌 'Application'에 저장했습니다. 'fields' 블록에 추가하는 방법을 상세히 설명하거나 제 2의 컨트롤러 스 니펫을 수정하여'ApplicationField'에 추가하는 방법을 알려줄 수 있습니까? – Catfish

+0

컨트롤러의'Application' 객체에'ApplicationField' 속성을 지정하려고합니다. 컨트롤러의 두 번째 마지막 줄에는 '@application.section_id = ...'이 있지만, 여러분의 모델에 따라 그 클래스의 클래스에는 그 메소드가 포함되어 있지 않습니다. 그게 될 수 있을까요? –

답변

2

대신의 link_to 방법에 section_id를 전달에 변수로 전달 시도 render 방법 :

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

이 방법 당신은 당신의 컨트롤러에 게시 된 양식 데이터에 section_id을 추가 부분 당신의 application_field_fields에 숨겨진 필드를 삽입 할 수 있습니다 : 그냥 추측

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

잘 작동했습니다. – Catfish