感谢stackoverflow的帮助,我让我的创建嵌套模型表单工作了一天,但我不能为我的生活得到相应的更新表格工作。我已经阅读了很多内容并尝试了尽可能多的解决方案。
表单看起来很好,但制造商和规模的嵌套属性(通过下拉列表选择)没有当前值。表单的所有非嵌套元素都可以正常工作。
无论您对两个嵌套下拉列表所做的更改,按下保存更改都会在相应的表格中创建新行,并且不会更改现有行。
最终我想要的是属性可编辑,然后我将有一个“添加制造商”和“添加比例”按钮或链接,用于需要多个列表的微缩模型。
以下是我尝试过的表单字段,但未通过隐藏字段。
表格
<%= render 'shared/error_messages', object: f.object %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :material %>
<%= f.select 'material', options_from_collection_for_select(Miniature.select("DISTINCT material"), :material, 'material', @miniature.material) %>
<%= f.fields_for :sizes do |size_fields| %>
<%= size_fields.label :scale_id, "Scale".pluralize %>
<%= hidden_field "Miniature Scale", @miniature.sizes %>
<%= size_fields.select :scale_id, options_from_collection_for_select(Scale.all, :id, :name) %>
<% end %>
<%= f.fields_for :productions do |production_fields| %>
<%= production_fields.label :manufacturer_id, "Manufacturer".pluralize %>
<%= hidden_field "Miniature Manufacturer", @miniature.productions %>
<%= production_fields.select :manufacturer_id, options_from_collection_for_select(Manufacturer.all, :id, :name, @miniature.manufacturers) %>
<% end %>
<%= f.label :release_date %>
<%= f.date_select :release_date, :start_year => Date.current.year, :end_year => 1970, :include_blank => true %>
这是迷你控制器,我很确定我已经用太多/错误的东西填充了'def update'。
微缩模型控制器
class MiniaturesController < ApplicationController
before_action :signed_in_user, only: [:new, :create, :edit, :update]
before_action :admin_user, only: :destroy
def show
@miniature = Miniature.find(params[:id])
end
def new
@miniature = Miniature.new
@miniature.productions.build
@miniature.sizes.build
end
def create
@miniature = Miniature.new(miniature_params)
@production = @miniature.productions.build
@size = @miniature.sizes.build
if @miniature.save
redirect_to @miniature
else
render 'new'
end
end
def edit
@miniature = Miniature.find(params[:id])
end
def update
@miniature = Miniature.find(params[:id])
@production = @miniature.productions.find(params[:id])
@size = @miniature.sizes.find(params[:id])
if @miniature.update_attributes(miniature_params)
@production = @miniature.productions.update_attributes(:manufacturer_id)
@size = @miniature.sizes.update_attributes(:scale_id)
flash[:success] = "Miniature updated"
redirect_to @miniature
else
render 'edit'
end
end
def index
@miniatures = Miniature.paginate(page: params[:page])
end
def destroy
Miniature.find(params[:id]).destroy
flash[:success] = "Miniature destroyed."
redirect_to miniatures_url
end
private
def miniature_params
params.require(:miniature).permit(:name, :release_date, :material, productions_attributes: [:manufacturer_id], sizes_attributes: [:scale_id])
end
def admin_user
redirect_to(root_url) unless current_user.admin?
end
def signed_in_user
unless signed_in?
store_location
redirect_to signin_url, notice: "Please sign in."
end
end
end
我不会附加模型,因为我很确定关系是正确的,因为它们可以很好地创建新的嵌套模型。 微缩模型可以通过尺寸和制作来扩展和制造。
非常感谢任何帮助或指示。
答案 0 :(得分:2)
感谢this Q的回答,我已经解决了。我已经对CREATING很好但是没有为UPDATES工作,因为我没有在'miniature_params中将JOIN模型ID列入白名单,所以他们无法检索现有信息。
现在我有productions_attributes: [:id, :manufacturer_id]
而不是productions_attributes: [:manufacturer_id]
如下
def miniature_params
params.require(:miniature).permit(:name, :release_date, :material, productions_attributes: [:id, :manufacturer_id], sizes_attributes: [:id, :scale_id])
end
我也可以从我的微缩模型控制器更新方法中删除所有对嵌套模型的引用,因为它“正常工作”。
def update
@miniature = Miniature.find(params[:id])
if @miniature.update_attributes(miniature_params)
flash[:success] = "Miniature updated"
redirect_to @miniature
else
render 'edit'
end
end
希望这对将来有用。