2014-09-20 2 views
2

Я использую pundit для обработки разрешений в рубине на приложении rails, и я хочу посмотреть, может ли пользователь, который вошел в систему, умерить, прежде чем показывать кнопки удаления и редактирования для сообщений, комментариев, и т.д.Пытается сделать авторизацию пользователя более DRY с pundit

Вот оригинальный метод работы в почтовой политике, политика и т.д. комментарий

def destroy 
    user.present? && (user == record.user || user.role?(:admin) || user.role?(:moderator)) 
end 

Вот новый метод, который я добавил к политике приложения

def can_moderate?(user, record) 
    @user = user 
    @record = record 
    user == record.user || user.role?(:admin) || user.role?(:moderator) 
    end 

Вот сушилка после политики я работаю над

def destroy? 
    user.present? && user.can_moderate? 
    end 

Это сушилка версией дает мне неопределенный метод ошибки для can_moderate. Любые мысли о том, почему?

Спасибо!

EDIT TO Отправлять ERROR

ActionView::Template::Error (undefined method `can_moderate?' for #<User:0xb5671e60>): 
14:  <% if policy(@post).edit? %> 
15:  <%= link_to "Edit", edit_topic_post_path(@topic, @post), class: 'btn btn-success' %> 
16:  <% end %> 
17:  <% if policy(@post).destroy? %> 
18:  <%= link_to "Delete", [@topic, @post], method: :delete, class: 'btn btn-danger', data: { confirm: 'Are you sure you want to delete this topic?' } %> 
19:  <% end %> 
20: </div> 
app/policies/post_policy.rb:7:in `destroy?' 
app/views/posts/show.html.erb:17:in `_app_views_posts_show_html_erb___159039275__620331048' 
+0

Я хотел бы предложить вам идти вперед и вставьте всю ошибку здесь. Из описания вопроса вы получаете неопределенную ошибку для '' 'can_moderate''', но имя метода' '' can_moderate? '' '. Также, где вы упомянули метод? Тот же файл? – shayonj

ответ

2

Тиен,

Не называть can_moderate? на объекте пользователя. Предположим, что can_moderate? присутствует в пользовательском классе/модели. Вместо этого просто вызовите метод, поскольку в настоящем в том же файле/контроллере.

def destroy? 
    user.present? && can_moderate? 
    end 

Также вы можете иметь свой can_moderate? метод просто

def can_moderate?(user, record) 
    user == record.user || user.role?(:admin) || user.role?(:moderator) 
    end 
+0

А теперь понял. По какой-то причине я подумал, что мне нужно позвонить ему конкретному пользователю. Так что он работает волшебным образом с current_user, так как я использую devise. Благодаря! –

+0

Поскольку 'can_moderate?' Находится в политике приложения, у него не должно быть аргументов, на самом деле этот код, как он, будет вызывать 'ArgumentError' для ожидания 2, но получил 0. Эти переменные доступны через методы' attr_accessor'. – Cluster

-1

сушилке версия,

# policy file 
def destroy? 
    can_moderate? 
end 

def can_moderate?(user, record) 
    user.present? && user == record.user || 
        user.role?(:admin) || user.role?(:moderator) 
end 
Смежные вопросы