Rails - Pundit неопределенный метод «пользователь»

Я пытаюсь реализовать политику, которая ограничивает создание сообщения администратором или бизнесом. В свою очередь, редактировать может только владелец записи (компания), создавший сообщение, или администратор. Но я получаю сообщение об ошибке «пользователь неопределенного метода», может ли кто-нибудь помочь здесь?

Схема.rb

create_table "users", force: true do |t|
    t.string   "name"
    t.string   "email",                  default: "",    null: false
    t.string   "encrypted_password",     default: "",    null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,     null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.string   "confirmation_token"
    t.datetime "confirmed_at"
    t.datetime "confirmation_sent_at"
    t.string   "unconfirmed_email"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "role"

create_table "posts", force: true do |t|
    t.string   "name"
    t.string   "title"
    t.text     "content"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "user_id"
  end

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

def admin?
    role == 'admin'
  end

  def biz?
    role == 'biz'
  end

Пост_контроллер

def edit
    @post = Post.find(params[:id])
     authorize @post
  end

Post.show.html.erb

<% if policy(@post).edit? %>
    <%= link_to 'Edit', edit_post_path(@post) %> |
  <% end %>

Применение.политика

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

  def new?
    create?
  end

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

  def edit?
    update?
  end

person Fdwillis    schedule 13.01.2015    source источник
comment
Две вещи: (1) вы опубликуете вывод своей ошибки, потому что в ней недостаточно информации для ее отладки, и (2) пожалуйста, покажите всю политику приложения, чтобы я мог видеть, как настроен файл.   -  person nikkon226    schedule 20.01.2015


Ответы (1)


Если вы получили сообщение об ошибке "undefined method user", это означает, что пользователь равен нулю, и вы вызываете policy(@post).edit? в представлении show post, это означает, что он ищет метод редактирования, определенный в вашем файле post_policy.rb (или непосредственно в вашем application_policy.rb, если у вас нет файла post_policy.rb) def edit?, который, в свою очередь, вызывает метод обновления def update? и, наконец, метод обновления вызывается как:

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

Это означает, что пользователь нулевой, а вы звоните record.user, вот в чем проблема, поскольку record ничего не вызывает, вам нужно дважды проверить модель сообщения и убедиться, что сообщение принадлежит пользователю.

class Post < ActiveRecord::Base
  belongs_to :user
end
person bntzio    schedule 13.03.2015