생성 작업 중 하위 모형은 부모 id를 받지 않습니다
7238 단어 nested_form
묘사
안녕하세요. 저는 덧붙인 표를 실현하기 위해 노력하고 있습니다.나는 이미 접근했다고 생각했지만,create 작업을 실행하려고 시도했을 때, 오류가 발생했다* Bullets job can't be blank
* Roles job can't be blank
내가 보기에, job id (has many 관계의 부항) 의 정보는 플러그인 폼을 통해 전달되지 않은 것 같다.내가 뭐 하는 줄 알아?
다음은 기본 구조->
새'작업'을 만들 때 사용자는 그것에 대한 여러 가지 요점과 여러 개의'역할'을 쓸 수 있습니다
다음은 모델을 설정하는 방법입니다.
작업 모드
# == Schema Information
#
# Table name: jobs
#
# id :integer not null, primary key
# job_title :string(255)
# job_summary :string(255)
# qualifications :string(255)
# created_at :datetime
# updated_at :datetime
#
class Job < ActiveRecord::Base
validates :job_title, presence: true
validates :job_summary, presence: true
validates :qualifications, presence: true
has_many :bullets, dependent: :destroy
has_many :roles, dependent: :destroy
accepts_nested_attributes_for :bullets, :reject_if => lambda { |a| a[:bullet].blank? }, :allow_destroy => true
accepts_nested_attributes_for :roles, :reject_if => lambda { |a| a[:role_title].blank? }, :allow_destroy => true
#lambda { |a| a[:bullet].blank? } makes sure that on edit, if a value is left blank, then it doesn't save it
end
탄알 모형# == Schema Information
#
# Table name: bullets
#
# id :integer not null, primary key
# job_id :integer
# bullet :string(255)
# created_at :datetime
# updated_at :datetime
#
class Bullet < ActiveRecord::Base
belongs_to :job
validates :job_id, presence: true
validates :bullet, presence: true
end
본보기# == Schema Information
#
# Table name: roles
#
# id :integer not null, primary key
# job_id :integer
# role_title :string(255)
# role_desc :string(255)
# created_at :datetime
# updated_at :datetime
#
class Role < ActiveRecord::Base
belongs_to :job
validates :job_id, presence: true
validates :role_title, presence: true
validates :role_desc, presence: true
end
작업 컨트롤러:class JobsController < ApplicationController
before_action :signed_in_user, only: [:new, :create, :update, :show, :edit, :destroy] # index, at least partially is available to all viewers
before_action :admin_user, only: [:new, :edit, :update, :create, :destroy] # only admins can make jobs
def new
@job = Job.new
3.times {
@job.bullets.build
@job.roles.build
}
end
def create
@job = Job.new(job_params)
if @job.save
redirect_to root_path, :flash => { :success => "Job created!" }
else
render 'new'
end
end
def job_params
params.require(:job).permit(:job_title, :job_summary, :qualifications,
bullets_attributes: [:id, :bullet, :_destroy],
roles_attributes: [:id, :role_title,:role_desc, :_destroy])
end
end
잡스/새로운 관점<% provide(:title, "Publish a new job") %>
<%= nested_form_for @job do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.label :job_title %>
<%= f.text_field :job_title %>
<div style="margin-left:30px">
<%= f.fields_for :bullets do |bullet_form| %>
<%= bullet_form.label :bullet %>
<%= bullet_form.text_field :bullet %>
<%= bullet_form.link_to_remove "Remove this bullet" %>
<% end %>
<p><%= f.link_to_add "Add a Bullet", :bullets %></p>
</div>
<%= f.label :job_summary %>
<%= f.text_area :job_summary %>
<%= f.label :qualifications %>
<%= f.text_area :qualifications %>
<div style="margin-left:30px">
<%= f.fields_for :roles do |role_form| %>
<%= role_form.label :role_title %>
<%= role_form.text_field :role_title %>
<%= role_form.label :role_desc %>
<%= role_form.text_field :role_desc %>
<%= role_form.link_to_remove "Remove this Role" %>
<% end %>
<p><%= f.link_to_add "Add a Role", :roles %></p>
</div>
<%= f.submit "Publish the Job", class: "button" %>
<% end %>
저널다음은 좀 더 명확한 일지들입니다.
1) 양식을 제출할 때 프로젝트 기호를 하나만 선택하면 개발 과정에서 다음과 같은 매개 변수를 얻을 수 있습니다.
--- !ruby/hash:ActionController::Parameters
utf8: ✓
authenticity_token: ezgktBZjcrdI6nMTro8Aqd0Djs2k3M+HFAdACrxajS8=
job: !ruby/hash:ActionController::Parameters
job_title: Job Title example
bullets_attributes: !ruby/hash:ActionController::Parameters
'0': !ruby/hash:ActiveSupport::HashWithIndifferentAccess
bullet: Example bullet
_destroy: 'false'
job_summary: Job Summary Example
qualifications: Example Qualifications here
roles_attributes: !ruby/hash:ActionController::Parameters
'1387448871560': !ruby/hash:ActiveSupport::HashWithIndifferentAccess
role_title: Example Role Name
role_desc: Example Role Description
_destroy: 'false'
commit: Publish the Job
action: create
controller: jobs
내 Rails 서버에서 이렇게 말했어->Started POST "/jobs" for 127.0.0.1 at 2013-12-19 14:28:01 +0400
Processing by JobsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"ezgktBZjcrdI6nMTro8Aqd0Djs2k3M+HFAdACrxajS8=", "job"=>{"job_title"=>"Job Title example", "bullets_attributes"=>{"0"=>{"bullet"=>"Example bullet", "_destroy"=>"false"}}, "job_summary"=>"Job Summary Example", "qualifications"=>"Example Qualifications here", "roles_attributes"=>{"1387448871560"=>{"role_title"=>"Example Role Name", "role_desc"=>"Example Role Description", "_destroy"=>"false"}}}, "commit"=>"Publish the Job"}
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '449addc616f3035c031b3220404a4d5eb5351c74' LIMIT 1
(0.2ms) begin transaction
(0.2ms) rollback transaction
Rendered shared/_error_messages.html.erb (2.4ms)
Rendered jobs/new.html.erb within layouts/application (15.7ms)
Rendered layouts/_shim.html.erb (0.1ms)
Rendered layouts/_header.html.erb (1.3ms)
Completed 200 OK in 101ms (Views: 32.0ms | ActiveRecord: 0.7ms | Solr: 0.0ms)
토론 #1
문제는 서브모델에 job id가 있는validates유효성 검사:job id, 상태:true
이 검증을 삭제할 때, 폼 기능이 정상적이고, 작업 id가 플러그인 모델에 추가됩니다.
내 직감으로는, 검증은 rails에서job id를 만들기 전에 발생할 수 있기 때문에 전체 과정이 완전히 멈출 수 있다는 것이다.
토론 #2
이것이 바로accepts_nested_attributes_for
궤도에서의 작업 방식이다.nested_form
gem는 폼 도움말 프로그램과 일부javascript로만 포장합니다.아마도 당신의 연상에 설정
inverse_of
을 하는 것이 도움이 될 것입니다.
Reference
이 문제에 관하여(생성 작업 중 하위 모형은 부모 id를 받지 않습니다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/ryanb/nested_form/issues/306텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)