我有一个使用嵌套资源的应用程序(请参阅下面的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>