我正在尝试学习如何在 Rails 5 应用程序中使用范围。
我问了一个背景问题here https://stackoverflow.com/questions/41755032/rails-5-exclude-specific-instances-from-edit-path-on-parent-controller.
我的 Rails 5 应用程序中有用户、提案和潜力的模型。
用户创建提案,然后他们自己和其他人可以对其发表评论。
模型之间的关联是:
User
has_many :proposals, dependent: :destroy
has_many :potentials
Proposal
belongs_to :user
has_many :potentials, inverse_of: :proposal
accepts_nested_attributes_for :potentials, reject_if: :all_blank, allow_destroy: true
潜在的
belongs_to :proposal, inverse_of: :potentials
belongs_to :user
在我的路线文件中,我有两个潜力资源。我不确定我是否已经脱离了滑雪道——否则我找不到如何做到这一点的例子。我两者都有:
resources :potentials
也:
resources :proposals do
resources :potentials
客观的:
当提出提案的用户尝试编辑它时,我只希望该用户能够编辑他们自己创建的潜力。
我为潜力设置两条路线的原因是嵌套资源在提案表单内有一个嵌套表单字段,以便提案创建者可以以这种方式创建潜力。任何其他看到该提案并做出潜在贡献的用户都可以通过单独的表格来完成。
任何用户(包括提案创建者,都可以通过该单独的表单编辑潜力),并且提案创建者还可以通过提案表单中的嵌套表单编辑自己的任何提案。
目前,每当我编辑提案表单(即使我不编辑潜在的嵌套字段)时,所有潜在的字段都会更新,以插入提案创建者的用户 ID,覆盖实际的潜在创建者的用户 ID。
Solution
我试图限制提案控制器中的编辑操作,以便仅允许编辑提案/潜力(如果它们具有 user_id == props.user_id)。
为此,我在我的proposal.rb中编写了范围
scope :owner_potentials, ->{ where(user_id: potential.user_id ) }
scope :third_party_potentials, ->{ where(user_id: != potential.user_id) }
我喜欢上面的帖子中的解决方案是尝试使用范围。由于作用域是用于类而不是实例,所以我一直在尝试找出如何调整它们,以便我可以使用作用域来搜索所有合规的电位(即势能.user_id = = 提案.user_id)。这意味着我不是搜索提案类,而是搜索具体提案。
这个帖子 https://stackoverflow.com/questions/10413058/rails-scopes-undefined-methods建议在相关控制器操作中定义 Event.all ,但是我该如何限制它,使其仅应用于特定的电位编辑行?我的编辑操作中有其他行不应在提案表上进行测试,而应仅在实例上进行测试。如果这能够奏效,我想我将需要重写我的范围以尝试排除所有其他提案。
有没有办法在特定实例上使用具有范围的控制器中的编辑操作?