Gem [已经解决] has_many netsed_form 中模型迭代的问题

yeyong14 · 2014年01月11日 · 最后由 yeyong14 回复于 2014年01月14日 · 3466 次阅读

productphoto

#product
has_many photos, dependent: :destroy
accepts_nested_attributes_for :photos, allow_destroy: :true,
        reject_if: proc{ |attrs| attrs.all? {|k, v| v.blank? }}
#photo
belongs_to product

在`Views 中

<%= nested_form_for @product, html: { multipart: true} do |f| %>
#
#
#
<%= f.fields_for :photos do |photo| %>
  <%= photo.file_field :image %>
  <%= photo.link_to_remove "删除", class: 'btn btn-mini btn-success' %>
<% end %>
<p><%= f.link_to_add "增加图片", :photos, class: 'btn btn-primary' %></p>

现在想达到这个效果。就是上传过的图片显示缩略图,下次改变图片就好改了

我是这样的做的,但效果不是想要的,每个产品的图片在嵌套中又迭代了一次。

还麻烦各位老师帮忙指点一下,这个要怎么改

<% @product.photos.each do |pho| %>
  <%= f.fields_for :photos do |photo| %>
    <%= image_tag(pho.image_url(:small)) if pho.image?%>
    <%= photo.file_field :image %>
    <%= photo.link_to_remove "删除", class: 'btn btn-mini btn-success' %>
  <% end %>
<% end %>
<p><%= f.link_to_add "增加图片", :photos, class: 'btn btn-primary' %></p>

有谁帮忙看一下吗

外面套了

<% @product.photos.each do |pho| %>

里面就需要再把 pho 传给 fields_for:

<% @product.photos.each do |pho| %>
  <%= f.fields_for pho do |photo| %>

另外如果你是想修改 photo 对象本身的图片文件而不是把整个 photo 对象替换掉,需要给 accepts_nested_attributes_for 传个参数 :update_only => true

还有,其实你这种情况好像没必要在外面套个 each,我看这段代码无非就是想引用那个 photo 对象嘛,直接用原来的代码改改:

<%= f.fields_for :photos do |photo_fields| %>
  <% photo = photo_fields.object %>
  <%= image_tag(photo.image_url(:small)) if photo.image?%>
  <%= photo_fields.file_field :image %>
  <%= photo_fields.link_to_remove "删除", class: 'btn btn-mini btn-success' %>
<% end %>
<p><%= f.link_to_add "增加图片", :photos, class: 'btn btn-primary' %></p>

@yuan 好了。非常感谢

<% photo = photo_fields.object %>

这个是什么意思

#3 楼 @yeyong14 可以通过它访问到跟这个 form helper 绑定的 model(我把你之前 block 里的参数 photo 重命名成了 photo_fields)。

@yuan 谢谢大师!

#5 楼 @yeyong14 哈哈.. 不客气不客气

@yuan 大师,有一个新手问题烦请看下。在collection_select中怎么获取selected 关系是这样的

#category
has_many tags
#tag
has_many products
#product
belongs_to tag

现在想在products/edit中看到之前选过的值。

<%= form_for @product |f| %>
#
#
<%= collection_select(:tag. :category_id, Category.all, :id, :name, {selected: Category.all.map{|cate| [cate.id, cate.name]}}) %>
<!-- 这样就全部选上了-->
<%= grouped_collection_select(:product, :tag_id, Category.all, :tags, :id, :id, :name) %>
<!--这个grouped_collection_select有selected. -->
需要 登录 后方可回复, 如果你还没有账号请 注册新账号