2013-03-06 12 views
0

Я пытался сделать это в течение нескольких часов. Я довольно новичок в Ruby и Rails.Рубин на рельсах, определяющих переменные

В файле devise.html.erb У меня есть

<div class="container"> 
<%= render :partial => 'layouts/header' if user_signed_in? %> 
</div> 

Вышеприведенные отлично работает. Если пользователь выполнил вход в систему, то они увидели заголовок в верхней части моей страницы, , если они не вошли в систему, они не видят этого.

Но мне нужно иметь (потому что пользователь должен поставить в адрес на следующей странице):

<div class="container"> 
<%= render :partial => 'layouts/header' if current_user.registration_complete? %> 

И когда я перезапустить мое приложение, я получаю сообщение об ошибке:

NoMethodError in Devise/registrations#new 

Я registration_complete определен в моем проекте, в user.rb (какие другие части моего проекта не имеют проблем с распознаванием) как:

#Determines whether user completed his profile on registration or not 
def registration_complete? 
self.address.present? 
end 

Есть ли где-то еще я должен поставить этот код, чтобы он был распознан в моем devise.html.erb?

+1

Дайте полную ошибку для NoMethodError. Например, мы не можем понять, откуда оно взялось (хотя я предполагаю, что это произошло от вызова 'registration_complete? ' – Jesper

+0

' NoMethodError' ... что? Какой метод недоступен? (Я предполагаю, что он жалуется 'current_user') – Chowlett

ответ

2

NoMethodError in Devise/registrations#new потому, что -

Рассмотрим это:

<div class="container"> 
<%= render :partial => 'layouts/header' if current_user.registration_complete? %> 

current_user в приведенном выше коде nil, поскольку для регистрации страницы пользователь не вошел в систему

Так registration_complete нет метода. для ноль.

Вы также можете проверить наличие current_user в любом месте вашего кода;

if current_user 
#User is logged in 
    <div class="container"> 
    <%= render :partial => 'layouts/header' if current_user.registration_complete? %> 
else 
#User is not logged in 
#Don't try current_user.registration_complete? check here..it will give error. 
end 

Таким образом, вы можете поместить код, содержащий current_user.registration_complete? проверку в любом месте вашего приложения при условии, что вы вошли в систему

0

А что:.

<%= render :partial => 'layouts/header' if current_user && current_user.registration_complete? %> 
0

Как Saurabh Jain уже указывалось, ваш CURRENT_USER иногда будет ноль, так что вам придется каким-то образом справиться с этим.

Его if-statement для current_user - хороший способ его обработки.

Другой способ структурирования этого состоит в том, чтобы поместить всю логику, определяет, видит ли пользователь заголовок в вспомогательном методе или даже лучше в презентаторе (см., Например, draper).

В контроллере я также должен убедиться, что здесь всегда присутствует пользовательский объект. Если ни один пользователь не вошел в систему, я создам новый объект User как манекен. Таким образом, будут менее неприятные проблемы с nil.

Например:

# In your controller 
@user = current_user || User.new 

# In a helper 
def can_see_header? (user) 
    user_signed_in? and user.registration_complete? 
end 

# In view 
<div class="container"> 
    <% if can_see_header? @user %> 
    <%= render "layouts/header" %> 
    <% end %> 
</div> 

:partial ключ в визуализации вызова требуется только когда вы хотите передать дополнительные параметры, по крайней мере, в более поздних версиях офф Rails.

0

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

В конце я использовал комбинацию решения Adbeel и Jesper, которое, похоже, выполняет эту работу.

я использовал:

<div class="container"> 
<%= render :partial => 'layouts/header' if user_signed_in? && current_user.registration_complete?%> 
</div> 

Как я уже сказал, он прекрасно работает, но если вы думаете, есть какая-то катастрофа таится вперед, я не знаю, о, я был бы признателен, если бы вы дайте мне знать, !Еще раз спасибо.

Christophe.

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