collection_select不过滤(在嵌套资源的嵌套形式中)

时间:2013-08-13 13:06:48

标签: ruby-on-rails ruby-on-rails-3 activerecord nested-resources

我有一个使用嵌套资源的应用程序(请参阅下面的routes.rb)来完全隔离用户。它工作得很好,直到我使用collection_select允许用户从其他模型中选择对象。例如,如果我以用户A的身份访问商店索引视图,我只会看到用户A创建的商店。但是,如果我访问store_group视图并尝试从{{下的collection_select菜单中选择要添加到该组的商店1}},我看到所有用户创建的所有商店。

据我所知,问题可能会发生,因为store_group控制器中没有存储过滤器。 store_group_details没有控制器,但是根据我的阅读,这似乎是正确的,因为模型只能通过store_group视图中的嵌套表单进行访问。我有另一种情况,另一个资源的另一个视图有几个collection_select菜单,用于从其他模型中选择对象,并且所有这些菜单都有相同的问题(它们显示该模型中的所有对象,无论用户创建它们)。

如何过滤collection_select菜单中显示的对象?这是我传递给collection_select的问题,还是因为控制器在显示这些模型的对象之前没有做任何事情来过滤其他模型?我查看了collection_select的文档,并且无法使其基于此工作。

感谢您的帮助,我花了很多时间试图让它发挥作用。

user.rb

fields_for :store_group_details

store.rb

class User < ActiveRecord::Base
  has_many :store_groups
  has_many :stores
  has_many :store_group_details
end

store_group.rb

class Store < ActiveRecord::Base
  belongs_to :user
  has_many   :store_group_details
  has_many   :store_groups, :through => :store_group_details
end

store_group_detail.rb

class StoreGroup < ActiveRecord::Base
  belongs_to :user
  has_many   :store_group_details, :inverse_of => :store_group
  has_many   :stores, :through => :store_group_details

  accepts_nested_attributes_for :store_group_details

  attr_accessible :store_group_details_attributes

end

_store_group_form.html.erb

class StoreGroupDetail < ActiveRecord::Base  
  belongs_to :store
  belongs_to :store_group
  belongs_to :user

  attr_accessible :store_id

  delegate :store_name, :to => :store

end

_store_group_detail_fields.html.erb

<div class="container">
  <div class="span8">

    <%= nested_form_for([@user, @store_group]) do |f| %>

      <%= render 'shared/error_messages', object: f.object %>

      <%= f.label "Store Group Name (required)" %>
      <%= f.text_field :store_group_name %>

      <%= f.label "Store Group Description" %>
      <%= f.text_area :store_group_description %>

      <%= f.fields_for :store_group_details  %>
      <p><%= f.link_to_add "Add store to group", :store_group_details %></p>
        <br>
      <%= f.submit "Submit", class: "btn btn-large btn-primary" %>

    <% end %>

  </div>
</div>

的routes.rb

<p>
  <%= f.label "Select Store:" %>
  <%= f.collection_select :store_id, Store.order(:store_name),
           :id, :store_name, include_blank: true %>
  <%= f.link_to_remove "remove" %>
</p>

1 个答案:

答案 0 :(得分:0)

您的控制器一定有问题。你有没有解决过这个问题? 请查看this answer,因为它可能会导致解决方案。或者添加stores_controller.rb。