2014-04-17 1 views
0

При попытке настроить политики для моего практического приложения. Я столкнулся с «No Method Error» в моем контроллере сообщений.Как разрешить «No Method Error» в моем постконтроллере. Devise, Pundit, Blogging app

Если мы установили нуль на постконтроллере, и мой метод обновления здесь - это код.

def update 
authorize @post 
respond_to do |format| 
if @post.update(post_params) 

    format.html { redirect_to @post, notice: 'Post was successfully updated.' } 
    format.json { head :no_content } 
    #redirect_to @post 

else 
    render :edit 
    format.html { render action: 'edit' } 
    format.json { render json: @post.errors, status: :unprocessable_entity } 
end 
end 

конец

Как вы можете увидеть ничего особенного. Просто HTML и JSON рендеринг обновленной страницы.

Код authorize указывает на помощника в экспертном совете, который просматривает политику доступа.

Определенный в моей модели Admin.rb у меня есть.

def editor? 
    self.role == 'editor' 
    end 

authorize код смотрит политику, которая соответствует имени метода. Он просматривает класс политики и начинает применять бизнес-правила, найденные здесь. И вот здесь проблемы начинаются.

Я получаю def update? @admin.editor? end

И это говорит undefined method 'editor?' for #<Class:0x007ffb7fa4f6a0>

Код на ветке политики на Git: https://github.com/wmuengineer/portfolio/tree/policy

ответ

1

Извлеченный урок. Прочтите документы правильно. Мне нужно было использовать

def pundit_user 
    current_admin 
    end 

и он работает.

+0

Где вы определили этот метод? Я имею в виду, в каком контроллере вы его выразили? –

0

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

В соответствии с documentation вы можете настроить pundit_user как User.find_by_other_means. Я думаю, что этот метод должен возвращать экземпляр User. Вы переопределяете pundit_user как Admin. Я думаю, вы должны вернуть экземпляр класса Admin

+0

Я добавил код «def pundit_user Admin end» и «def pundit_user Admin.current_admin end» в начало файлов ApplicationPolicy и PostPolicy .. Не повезло. Могу ли я добавить этот код в нужное место @gotva? –

+0

из [документации] (https://github.com/elabs/pundit#customize-pundit-user) 'Просто определите метод в вашем контроллере pundit_user'. Я думаю, вы должны определить его в контроллере – gotva

+0

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