Rails 4 — Pundit и ассоциации

Я пытаюсь сделать приложение с Rails 4.

Я использую pundit с devise.

Я пытаюсь написать политику адресов в Pundit.

У меня есть три соответствующие модели: user.rb, profile.rb и address.rb.

Ассоциации таковы:

пользователь.rb

has_one :profile

профиль.rb

belongs_to :user
  has_many :addresses, as: :addressable

адрес.рб

 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

У меня возникли проблемы, как выяснить, как написать эту политику. Адрес полиморфен. Профиль может иметь много адресов и профиль принадлежит пользователю. Итак, для политики я хочу, чтобы пользователь, которому принадлежит профиль, создавал и обновлял адреса. Я борюсь, потому что не могу понять, как поместить профиль в цепочку ассоциаций, чтобы связать пользователя и адрес.

Текущий метод ошибки с этой политикой начинается с create? функция:

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

Кто-нибудь может увидеть, как это сделать?


person Mel    schedule 30.12.2015    source источник


Ответы (1)


Вы можете проверить, включают ли адреса пользователя адрес:

user && user.profile.addresses.exists?(address.id)
person Plamena Gancheva    schedule 04.01.2016
comment
Привет - спасибо Пламена. Это сработало, что делает (address.id) в конце? - person Mel; 04.01.2016
comment
И почему это работает в действии create? Нет адреса, когда пользователь добавляет новый адрес? - person Mel; 04.01.2016
comment
Привет. Метод существует? принимает идентификатор или условия — вот документация: apidock.com/rails/ActiveRecord/FinderMethods /существует%3F. Вы можете использовать его, чтобы разрешить его редактирование только владельцу адреса. Каковы ограничения для создания адреса - не user.present? достаточно? - person Plamena Gancheva; 04.01.2016
comment
Я хочу, чтобы пользователь, у которого есть адрес, мог создавать/обновлять/уничтожать. - person Mel; 04.01.2016
comment
Вы можете разрешить пользователю с определенным адресом создавать новые адреса, но если вы хотите разрешить пользователю без адреса создавать один, вы должны проверить только наличие пользователя или какое-либо другое бизнес-правило. Может быть, я что-то упускаю, но у адреса нет владельца до его создания. - person Plamena Gancheva; 04.01.2016
comment
Я беспокоился, что если у меня просто будет действие создания как user.present? тогда любой пользователь сможет создать адрес. Я просто хочу, чтобы соответствующий пользователь (кому будет принадлежать адрес) создал адрес - person Mel; 05.01.2016