ネストされたリソース (以下の 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 のドキュメントを見てきましたが、それに基づいて機能させることができませんでした。
ご協力いただきありがとうございます。これを機能させるためにかなりの時間を費やしました。
user.rb
class User < ActiveRecord::Base
has_many :store_groups
has_many :stores
has_many :store_group_details
end
store.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