2011-07-21 2 views
5

В приложении Rails 3.1 у меня есть метод, называемый user_logged_in? из Devise, который я хочу использовать для частичного выборочного отображения. Вот код в layouts/application.html.erb:Rails 3, только рендеринг частично, если пользователь зарегистрирован

<% if user_logged_in? %> 
<%= render :partial => "home/statusbar" %> 
<% end %> 

Он использует частичный с другого контроллера. Это парциальное:

<div id="status_bar"> 
    Signed in as <%= link_to current_user.name, edit_user_registration_path %> 
</div> 

ошибка происходит при current_user.name (неопределенного метода), так как это current_usernil. Я мог бы переместить user_logged_in? чек внутри частичного, но я думаю, что было бы немного более эффективно, если бы оно было в представлении.

Не могли бы вы направить меня к тому, что такое лучшие практики, или как я могу преодолеть неопределенную ошибку метода? Нормально ли, что Rails проверяет код шаблона, даже если он находится в блоке if, который терпит неудачу?

ответ

13

Похоже, что user_logged_in? - то, где что-то идет не так. Работает, если вы измените это?

<% if current_user.present? %> 
    <%= render :partial => "home/statusbar" %> 
<% end %> 
+3

Да, это так. Он также работает, если я использую user_signed_in ?. Совершенно неправильный метод. Извините и спасибо! – joseph

1

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

<% if false %> 
    <%= render :partial => "home/statusbar" %> 
<% end %> 

и посмотреть, не сработает ли он. bettter решение будет

<% if current_user %> 
    <%= render :partial => "home/statusbar" %> 
<% end %> 

Я незнаком с завещанию, но это должно работать Поскольку текущий пользователь Виль ноль, если никто не вошел в

+0

Вы правы, я должен был использовать user_signed_in, а не user_logged_in! Спасибо за информативный ответ. – joseph

4

Я знаком с Завещания, но не метод user_logged_in? - Вы сами определили это? Обычный помощник, используемый в представлениях, - user_signed_in?. Кроме того, попробовать что-то вроде следующего:

<% puts user_logged_in?.inspect %> 
<% puts user_signed_in?.inspect %> 

Выше, если заявление в вашей точки зрения, и проверить журналы, чтобы убедиться, что ваш звонок правильно возвращения false (user_signed_in? также должны возвращаться false). Вы не должны получать нулевую ошибку в этой частице, если она фактически не отображается (это означает, что код ввел оператор if).

0

Существует еще более короткий путь, чтобы сделать ваш парциальное с условной

<%= render(partial: "home/statusbar") if current_user.present? %> 
1

Я нашел решение, как представляется,

user_logged_in? 

Не используется больше, и вместо этого вам нужно использовать

user_signed_in? 

Так с кодом вы дали это должно работать:

<% if user_signed_in? %> 
    <%= render :partial => "home/statusbar" %> 
<% end %> 

Этот код для меня был частичным.

Смежные вопросы