Ruby on rails 接受表单中发布的\u嵌套\u属性\u
在问这个问题之前,我已经尝试过详细的解决方案,但没有成功 背景:2个模型、想法和项目。1个想法属于1个项目,1个项目有很多想法。 我想创建一个表单,通过指示Project\u id字段来创建具有想法字段的想法,同时指定它们属于哪个项目。我使用的是接受嵌套属性 问题:从表单创建新想法时,我无法获取项目id。从控制台中,我看到一个新想法已被保存,但该想法的project_id始终返回nil 代码: ideas_controller.rbRuby on rails 接受表单中发布的\u嵌套\u属性\u,ruby-on-rails,Ruby On Rails,在问这个问题之前,我已经尝试过详细的解决方案,但没有成功 背景:2个模型、想法和项目。1个想法属于1个项目,1个项目有很多想法。 我想创建一个表单,通过指示Project\u id字段来创建具有想法字段的想法,同时指定它们属于哪个项目。我使用的是接受嵌套属性 问题:从表单创建新想法时,我无法获取项目id。从控制台中,我看到一个新想法已被保存,但该想法的project_id始终返回nil 代码: ideas_controller.rb # GET /ideas/new def new @idea
# 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
classidea
_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 %>
禁止保存此想法:
“数字”%>
“嵌套属性允许您通过父项将属性保存在相关记录上。”。你是通过孩子
来完成的,我认为这是不可能的
因此,将接受
的嵌套属性\u移动到父模型,并使用父
表单创建父
字段以及子
字段。因此,您将通过projects\u controller
和projects/\u form.html.erb
或者选择不做别的事情
不使用为
接受嵌套的属性,将项目ID
作为空数组添加到您的想法
参数属性中:
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>
此代码将为您提供要选择的项目的复选框。这意味着首先必须以项目自己的控制器和表单创建项目。因此,您没有使用嵌套属性 将此@idea.build_project
更改为:@idea.project.build
可能会有所帮助。不,它会崩溃,并在编辑的行上为nil:NilClass返回未定义的方法“build”。