在问这个之前,我已经尝试过详细解决here的解决方案,但它没有用。
上下文:2个模型,Idea和Project。 1个想法属于1个项目,1个项目有很多想法。 我想通过指示 project_id 字段来创建一个表单来创建具有创意领域的想法,同时指定他们所属的项目。我正在使用accepts_nested_attributes_for
进行此操作问题:我从表单创建新构思时无法获取project_id。从控制台我看到已经保存了一个新想法,但该想法的project_id总是返回nil
代码:
ideas_controller.rb
# GET /ideas/new
def new
@idea = Idea.new
@idea.build_project
respond_to do |format|
format.html # new.html.erb
format.json { render json: @idea }
end
模型> idea.rb
class Idea < ActiveRecord::Base
belongs_to :project
accepts_nested_attributes_for :project
mount_uploader :picture, PictureUploader
validates :name, presence: true, allow_blank: false
end
_form.html.erb
<%= form_for(@idea) do |f| %>
<% f.fields_for :project do |project_fields| %>
<% if @idea.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@idea.errors.count, "error") %> prohibited this idea from being saved: </h2>
<ul>
<% @idea.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :description %><br>
<%= f.text_area :description %>
</div>
<div class="field">
<%= f.label :picture %><br>
<%= f.file_field :picture %>
</div>
<div class="field">
<%= f.label :project %><br>
<%= f.number_field :project_id, :class=>"Number" %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
<% end %>
答案 0 :(得分:0)
“根据documentation,”嵌套属性允许您通过parent
“保存关联记录的属性。你是通过child
做到的,我认为这是不可能的。
因此,请将accepts_nested_attributes_for
移至父模型,然后使用parent's
表单创建parent
字段以及child
字段。因此,您将通过project
和idea
projects_controller
和projects/_form.html.erb
或选择退出其他内容。
不使用accepts_nested_attributes_for
,将project_ids
作为空数组添加到ideas
参数属性中:
def idea_params
params.require(:idea).permit(:name, :project_ids => [])
end
app/views/ideas/_form.html.erb
:
<div>
<%= idea.label 'File under at least one project' %>
<% Project.all.order(name: :asc).each do |project| %>
<div>
<%= check_box_tag "idea[project_ids][]", project.id %>
<%= project.name %>
</div>
</div>
此代码将为您提供要选择的项目的复选框。这意味着首先必须在项目自己的控制器和表单中单独创建项目。所以你没有使用嵌套属性。