2016-08-24 3 views
1

Я пытаюсь научиться использовать pundit с моим приложением Rails 4.Rails 4 - pundit - как написать if, чтобы проверить права пользователя

У меня есть политика использования потенциала. Таблица потенциального использования имеет атрибут: user_id.

Я хочу, чтобы пользователям разрешалось обновлять экземпляры, если они их создали. Я пытаюсь выяснить, как заставить действие обновления работать.

Мои текущие попытки показаны ниже.

class PotentialUsePolicy < ApplicationPolicy 

    attr_reader :user, :record 

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


    def index? 
     true if user.is_admin? 
    end 

    def show? 
     true 

    end 

    def new? 
     true 
    end 

    def create? 
     new? 
    end 

    def update? 
     if @user.id == @potential_use.user_id 

     # if user.id == potential_use.user_id 
      true 
     else 
      false 
     end 
    end 

    def destroy? 
     update? 
    end 

    def edit? 
       true 
    end 

    def potential_use 
     record 
    end 

end 

Когда я пытаюсь это, я продолжаю получать ошибки говоря:

undefined method `user_id' for nil:NilClass 

Я не понимаю, почему я получаю это сообщение. Когда я смотрю в консоли, я вижу запись с идентификатором пользователя.

p = PotentialUse.where(project_id: 26) 
    PotentialUse Load (0.5ms) SELECT "potential_uses".* FROM "potential_uses" WHERE "potential_uses"."project_id" = $1 [["project_id", 26]] 
=> #<ActiveRecord::Relation [#<PotentialUse id: 9, comment: "adsfsfdadfasdddxxddbbdd", project_id: 26, created_at: "2016-08-18 23:16:06", updated_at: "2016-08-24 01:06:00", user_id: 1, private_comment: false>]> 
2.3.0p0 :016 > 

Когда я смотрю с точкой зрения (не пытаясь использовать политику Пандита, страница предоставляет все нужное содержание, включая имя пользователя (доступ к которой осуществляется с помощью user_id).

Обновления действие в моем потенциальном контроллере Использовались:

def update 
    authorize @potential_use 
    respond_to do |format| 
     if @potential_use.update(potential_use_params) 
     format.html { redirect_to @project, notice: 'Potential use was successfully updated.' } 
     format.json { render :show, status: :ok, location: @potential_use } 
     else 
     format.html { render @project } 
     format.json { render json: @potential_use.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

Может кто-нибудь увидеть, что я сделал неправильно

ответ

0

Вы получаете доступ к санкционированным объектам с аксессорами в вашем бывшем?. достаточно, чтобы вы назвали

authorize @potential_use 

в вашем контроллере обновление действия. Обновление? метод на вашем контроллере будет выглядеть так:

def update? 
    user.id == record.user_id 
end 
+0

Но если у меня есть метод, называемый потенциальным использованием в моей политике, который определяется как запись. Итак - я думаю, что моя попытка (прокомментированная версия) такая же, как ваша. он не работает (nether делает версию, где я пытаюсь использовать символ «@». – Mel

+0

Кроме того, я попробовал ваше предложение, но он дает эту ошибку: undefined method 'user_id 'для # Mel

+0

Iam sorry, если этот вопрос неуместно, но вы назначили переменную @potential_use? Может быть, в before_action или что-то еще? –

Смежные вопросы