我有一个使用嵌套资源(见下面的 routes.rb)来完全隔离用户的应用程序。在我使用 collection_select 允许用户从其他模型中选择对象之前,它的效果很好。例如,如果我以用户 A 的身份访问商店索引视图,我只能看到用户 A 创建的商店。但是,如果我访问 store_group 视图并尝试从 下的 collection_select 菜单中选择要添加到组的商店fields_for :store_group_details
,我查看所有用户创建的所有商店。
据我所知,问题可能会发生,因为 store_group 控制器中没有商店过滤器。store_group_details 没有控制器,但根据我的阅读,这似乎是正确的,因为模型只能通过 store_group 视图中的嵌套表单访问。我还有另一种情况,另一个资源的另一个视图有几个用于从其他模型中选择对象的 collection_select 菜单,所有这些都有相同的问题(它们显示该模型中的所有对象,而不管是哪个用户创建的)。
如何过滤 collection_select 菜单中显示的对象?这是我传递给collection_select的内容的问题,还是因为控制器在显示这些模型的对象之前没有做任何事情来过滤其他模型?我查看了 collection_select 的文档,但无法基于此进行工作。
感谢您的帮助,我花了很多时间试图让它工作。
用户.rb
class User < ActiveRecord::Base
has_many :store_groups
has_many :stores
has_many :store_group_details
end
商店.rb
class Store < ActiveRecord::Base
belongs_to :user
has_many :store_group_details
has_many :store_groups, :through => :store_group_details
end
store_group.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_detail.rb
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_form.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>
_store_group_detail_fields.html.erb
<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>
路线.rb
resources :users do
resources :stores
resources :store_groups
resources :store_group_details
end