мой уничтожить? и upvote? методы не работают с Pundit, хотя я их разрешил - PullRequest
0 голосов
/ 28 апреля 2019

Я только что установил Pundit в своем приложении. Мне удалось реализовать pundit для новых методов создания и показа, однако, когда дело доходит до методов уничтожения и голосования, я получаю следующую ошибку Pundit::NotDefinedError in HairstylesController#upvote unable to find policy `NilClassPolicy` for `nil

вот мое репо для простоты понимания при необходимости: https://github.com/Angela-Inniss/hair-do

Я разрешил два метода 'upvote' и 'destroy' в моем контроллере. Я обновил соответствующую политику. Пожалуйста, смотрите код ниже.

Контроллер с указанными методами:

  def destroy
    authorize @hairstyle
    @hairstyle = Hairstyle.find(params[:id])
    @hairstyle.destroy
    redirect_to hairstyles_path
  end

  def upvote
    authorize @hairstyle
    @hairstyle = Hairstyle.find(params[:id])
    @hairstyle.upvote_from current_user
    redirect_to hairstyles_path
  end

файл pundit policy.rb:


  def upvote?
    record.user == user
    # - record: the restaurant passed to the `authorize` method in controller
    # - user:   the `current_user` signed in with Devise.
  end

  def destroy?
    record.user == user
  end

index.html.erb уничтожить файл html

 <% if policy(hairstyle).destroy? %>
              <p><%= link_to "Delete", hairstyle_path(hairstyle),method: :delete, data: { confirm: "Are you sure?" }%></p>
           <% end %>

index.html.erb файл upvote html (который работал до того, как я добавил pundit)

   <%= link_to like_hairstyle_path(hairstyle), method: :put do %>
               <i class="fa fa-heart">
                <span><%= hairstyle.get_upvotes.size %><span>
               </i>
            <% end %>

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

Ответы [ 2 ]

2 голосов
/ 28 апреля 2019

Разве вы не должны вызывать authorize после того, как объект установлен?Попробуйте перейти от

authorize @hairstyle
@hairstyle = Hairstyle.find(params[:id])

к

@hairstyle = Hairstyle.find(params[:id])
authorize @hairstyle
0 голосов
/ 29 апреля 2019

Здравствуйте, я решил свою проблему. Одна из причин была в том, что, как вы оба сказали выше, я вызывал полномочия не в том месте, где это должно было быть после установки объекта.

Следующая причина, по которой я получил ошибку:

Pundit::NotAuthorizedError in HairstylesController#upvote not allowed to upvote? this... #< потому что вместо:

def upvote? record.user == user end

в моей политике для upvote? метод,

Я должен был поставить это:

def upvote? return true end

...