2014-10-14 1 views
2

У меня есть веб-приложение Ruby on Rails, где пользователи создают заметки. Примечание принадлежит пользователю, который его создал.Не удается завершить действие нового контроллера через жемчужину Pundit

Я установил Pundit gem для создания полномочий, в частности роли администратора.

Я хотел бы для пользователя, чтобы быть в состоянии:

  • создавать, обновлять или удалять свои заметки

А для администратора, чтобы быть в состоянии сделать то же самое для любые примечания пользователя.

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

Вот сообщение об ошибке вспышки я получаю:

not allowed to new? this #<Note:0x007fe2ca17bc18> 

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

Вот соответствующие методы из моего application_policy.rb файла:

def index? 
    false 
    end 

    def show? 
    scope.where(:id => record.id).exists? 
    end 

    def create? 
    user.present? 
    end 

    def new? 
    create? 
    end 

    def update? 
    user.present? && (record.user == user || user.admin?) 
    end 

    def edit? 
    update? 
    end 

    def destroy? 
    update? 
    end 

Вот мой note_policy.rb файл:

class NotePolicy < ApplicationPolicy 

    def create? 
    user.present? && (record.user == user || user.admin?) 
    end 

    def new? 
    create? 
    end 

    def update? 
    create? 
    end 

    def destroy? 
    update? 
    end 

end 

А вот соответствующие действия от моего notes_controller.rb файла:

def new 
    @note = Note.new 
    authorize @note 
    end 

    def create 
    @note = Note.new(notes_params) 
    @note.user = current_user 
    authorize @note 
    if @note.save 
     redirect_to notes_path 
    else 
     render :new 
    end 
    end 

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

спасибо.

ответ

4

В действии new проверка авторизации производится с использованием NotePolicy#create?. См цепочки вызовов ниже:

NotePolicy#new? ->ApplicationPolicy#new? ->NotePolicy#create?

Новая Примечание (@note = Note.new) не пройдет проверку полномочий, сделанную в NotePolicy#create?.

Добавить метод new? к NotePolicy, который реализует требуемую логику авторизации.

ДОБАВЛЕНО

Этот create? метод не будет проходить на новой ноты (Note.new).

def create? 
    user.present? && (record.user == user || user.admin?) 
end 

Для того, чтобы подтвердить, почему это так, вы можете отлаживать, добавив строку puts "#{user.present?} #{record.user} #{user}" в начале метода create?.

Вы увидите значения этих переменных на выходе сервера или logs/development.log.

+0

Я думал, что, поскольку 'note_policy' наследует от' application_policy', а так как у меня уже есть правильный 'новый метод' в' application_policy', что я буду закрыт? Я думал, что это часть наследства, и СУХОЙ? В любом случае, я добавил: 'def new create? end' в 'note_policy', и он все еще не работает. Получение того же сообщения об ошибке. Благодарю. – HPJAJ

+0

** ANSWER ** пришел из @EliotSykes. Для 'note_policy' добавить' def new user.present? end' Спасибо всем! – HPJAJ

1

Не хватает ли метода new? в вашей NotePolicy?

+0

Я думаю, что исправить это. –

+0

Я попробовал добавить 'new?', Все еще не работая. Такое же сообщение об ошибке. Я добавлю его в сообщение выше для полной справки. Благодарю. – HPJAJ