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 的文档,但无法基于此进行工作。

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

用户.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
4

1 回答 1

0

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

于 2013-12-29T10:28:05.647 回答