0

我正在尝试使用Rails 4制作应用程序。Rails 4 - 评论者和协会

我正在使用设计师。

我正在尝试在Pundit中编写一个地址策略。

我有三个相关的模型,分别是user.rb,profile.rb和address.rb。

的关联是:

user.rb

has_one :profile 

profile.rb

belongs_to :user 
    has_many :addresses, as: :addressable 

address.rb

belongs_to :addressable, :polymorphic => true 

我的地址方针是:

class AddressPolicy < ApplicationPolicy 

    def create? 
     user.present? && user == address.profile.user 
    end 

    def update? 
     user.present? && user == address.profile.user 
    end 

    def destroy? 
     user.admin? 
    end 

    private 
     def address 
      record 
     end 

end 

我很困难如何找出写这个政策的方法。地址是多态的。配置文件可以有许多地址,并且配置文件属于用户。因此,对于我希望拥有配置文件的用户创建和更新地址的策略。我很挣扎,因为我无法弄清楚如何将配置文件放入用户和地址之间的关联链中。

此策略的当前错误方法从创建开始?功能:

def create? 
     user.present? && user == address.profile.user 
    end 

的消息是:

undefined method `profile' for #<Address:0x007fbad7ac0cf8> 

我的地址策略从我的应用策略继承,其中初始化用户和记录:

class ApplicationPolicy 
    attr_reader :user, :record 

    def initialize(user, record) 
    @user = user 
    @record = record 
    end 

任何人都可以看到如何做到这一点?

回答

0

你可以检查用户的地址,包括地址:

user && user.profile.addresses.exists?(address.id) 
+0

嗨 - 感谢Plamena。这工作,这是什么(address.id)在这最后做什么? – Mel

+0

为什么这个工作在创建操作?用户添加新地址时没有地址? – Mel

+0

嗨。该方法“存在吗?”需要一个ID或条件 - 这里是文档:http://apidock.com/rails/ActiveRecord/FinderMethods/exists%3F。您可以使用它来仅允许地址的所有者对其进行编辑。什么是创建地址的限制 - 不是“user.present?”足够? –