Приложение Rails выдает «ошибка метода», когда видит <% if current_user.admin? %> - PullRequest
0 голосов
/ 25 марта 2012

Я использовал этот код в своих «пользовательских» представлениях, и у меня не было проблем: <% if current_user.admin?%>.Но использование его в наборе представлений, связанных с другим контроллером, выдает «Ошибка метода отсутствует».

Справочная информация: приложение позволяет администраторам создавать охотники за мусором.Администраторы должны иметь возможность удалять охоты.Я думал, что знаю, как все настроить, но, видимо, я что-то упустил.Вот мой код:

controller.rb

class HuntsController < ApplicationController

  def index
     @title = "All Hunts"
     @hunts = Hunt.order("name ASC") 
  end

  def show
    @hunt = Hunt.find(params[:id])
    @title = @hunt.name    
  end

  def new
    @hunt = Hunt.new
    @title = "New Hunt"  
  end

  def create
    @hunt = Hunt.new(params[:hunt])
    if @hunt.save
      flash[:success] = "Hunt created!"
      redirect_to hunts
    else
      @title = "New Hunt"
      render 'new'     
    end
  end

  def edit
    @hunt = Hunt.find(params[:id])
    @title = "Edit hunt"
  end

  def delete
    Hunt.find(params[:id]).destroy
    flash[:success] = "Hunt destroyed."
    redirect_to index  
  end

end

Views / Index.html.erb

    <h1>All Hunts</h1>

    <ul>
      <% @hunts.each do |hunt| %>
         <%= render hunt  %>
      <% end %>
    </ul>

    <%= link_to( "Create New Hunt", '/hunts/new') %> 

Views / _hunt.html.erb

<li>
  <%= link_to hunt.name, hunt %>
  <% if current_user.admin? %>
   <%= link_to "delete", hunt, :method => :delete, :confirm => "You sure?",
                                :title => "Delete #{hunt.name}" %>
  <% end %>
</li>

Сообщение об ошибке при попытке перейти на / hunts:

NoMethodError in Hunts#index
Showing ...../app/views/hunts/_hunt.html.erb where line #3 raised:
undefined method `admin?' for nil:NilClass

Ответы [ 2 ]

3 голосов
/ 25 марта 2012

current_user равно nil и, следовательно, не знает, как реагировать на admin?. Либо убедитесь, что current_user всегда является пользовательским экземпляром, либо убедитесь, что это не nil.

В Ruby 2.3+ можно использовать оператор «безопасной навигации» (&.):

if current_user&.admin?

В Ruby 2.2 и более ранних версиях используйте логическое короткое замыкание:

if current_user && current_user.admin?

Обратите внимание, что ActiveSupport имеет try, но имеет другое поведение, которое потенциально может скрывать ошибки. Для аналогичного поведения используйте try!.

Получение "неопределенного метода _____ для nil: NilClass" является очень распространенным явлением в Ruby, поэтому привыкайте к нему часто :).

0 голосов
/ 25 марта 2012

Вы должны войти в систему пользователя, чтобы создать экземпляр current_user.Если вы используете devise, используйте:

class HuntsController < ApplicationController
  before_filter :authenticate_user!

  def index
    ...
  end

  .......

end

в вашем контроллере.И убедитесь, что метод .admin? определен в вашей пользовательской модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...