0

ネストされたリソース (以下の 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
4

1 に答える 1