【发布时间】:2016-02-09 03:57:27
【问题描述】:
我有两个型号 item 和 user_item。 Item 有很多 user_items 和 user_items 属于 item。我有一个表单,用户可以在其中创建新项目。在表单中,用户应该包含一张图片。名称、描述和标签被保存到一个新的项目对象中。图片应保存为同时创建的 user_item 对象的属性。
我一直在阅读有关嵌套模型形式和强参数以及使用accepts_nested_attributes_for 的信息。我的表单似乎正在运行,但我不明白为什么我不需要accepts_nested_attributes_for。虽然看起来很有效,但我这样做的方式有问题吗?
表格
<%= simple_form_for @item, url: items_path, method: :post do |item_builder| %>
<div class="well">
<%= item_builder.input :name, required: false, error: false, label: "Item name" %>
<%= item_builder.input :description, as: :text, required: false, error: false, label: "Describe item" %>
<%= item_builder.input :tag_list, required: false, label: "Tags" %>
<%= item_builder.simple_fields_for @item, @item.user_items.build do |user_item_builder| %>
<%= user_item_builder.input :picture, as: :file, required: false, label: "Picture of you with this item" %>
<% end %>
</div>
<div class="clearfix">
<%= item_builder.submit 'Submit new item', class: "btn btn-primary pull-right inherit-width" %>
</div>
<% end %>
Items_controller
def create
Item.transaction do
@item = Item.create(name: item_params[:name],
description: item_params[:description],
tag_list: item_params[:tag_list],
created_by: current_user.id,
status: Item::STATUS[:pending])
if item_params[:item] == nil
@item.errors.add(:picture, "is required")
end
if @item.errors.empty?
@user_item = @item.user_items.build(user_id: current_user.id, picture: item_params[:item][:picture])
if @user_item.save
flash[:notice] = "Thank you for your item submission."
redirect_to items_path
else
render :new
raise ActiveRecord::Rollback, "Useritem create failed"
end
else
render :new
raise ActiveRecord::Rollback, "no picture"
end
end
end
private
def item_params
params.require(:item).permit(:name, :description, :tag_list,
item: :picture)
end
编辑:
我已经根据下面理查德的回答进行了更改,但我现在遇到了几个问题。这是我当前在 items_controller 中的创建操作
def create
@item= Item.new item_params
@item.status = Item::STATUS[:pending]
@item.created_by = current_user.id
@item.user_items.first.user_id = current_user.id
if @item.save
redirect_to items_path, notice: "Thank you for your item request!
else
render :new
end
end
验证失败时,我收到了缺少模板的错误,因此我添加了
else和render :new。现在验证失败时,会呈现新模板,但不显示图片的 fields_for 输入。
我在 user_item.rb 中有
validates_presence_of :picture,我有validates_associated :user_items在 item.rb 中,但我仍然可以提交没有图片的表单。正如您在有效提交中看到的那样,我需要将项目的状态属性设置为待处理,并将 created_by 属性设置为当前用户 ID。我还需要将 user_item 的 user_id 属性设置为当前用户 ID。我在控制器中设置了这个。我想知道像我在创建操作中这样设置是否是正确的方法。
【问题讨论】:
-
从这里开始很难弄清楚你在做什么。你有一个强大的参数方法,但你没有使用它。
simple_fields_for @item, @item.user_items.build很奇怪 - 只需将您要为其创建字段的关联名称传递给它。另请阅读将嵌套参数列入白名单的指南:guides.rubyonrails.org/…
标签: ruby-on-rails ruby-on-rails-4