Rails 3, только частичное рендеринг, если пользователь вошел в систему - PullRequest
5 голосов
/ 22 июля 2011

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

<% 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_user равен nil. Я мог бы переместить проверку user_logged_in? внутри партиала, но я думаю, что это было бы немного более эффективно, если бы оно было в виде.

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

Ответы [ 5 ]

13 голосов
/ 22 июля 2011

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

<% if current_user.present? %>
  <%= render :partial => "home/statusbar" %>
<% end %>
4 голосов
/ 22 июля 2011

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

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

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

1 голос
/ 24 декабря 2014

Я нашел решение, похоже, что

user_logged_in?

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

user_signed_in?

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

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

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

1 голос
/ 22 июля 2011

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

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

и посмотрите, не получится ли это.Лучшее решение было бы

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

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

0 голосов
/ 08 июля 2014

Существует еще более короткий способ визуализации вашего частичного с условным

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