在表单中的accepts_nested_attributes_for问题

时间:2014-05-25 12:44:24

标签: ruby-on-rails

在问这个之前,我已经尝试过详细解决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 %>

1 个答案:

答案 0 :(得分:0)

“根据documentation,”嵌套属性允许您通过parent“保存关联记录的属性。你是通过child做到的,我认为这是不可能的。

因此,请将accepts_nested_attributes_for移至父模型,然后使用parent's表单创建parent字段以及child字段。因此,您将通过projectidea

创建projects_controllerprojects/_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>

此代码将为您提供要选择的项目的复选框。这意味着首先必须在项目自己的控制器和表单中单独创建项目。所以你没有使用嵌套属性。