2013-03-12 12 views
1

Я пытаюсь выполнить определение до сохранения, как в моем файле Route.rb. (@ Current_user.email вызывает ошибку)Как использовать переменную, объявленную в ## _ хелпер-файле?

 class Route < ActiveRecord::Base 

    before_save { |route| route.created_by = @current_user.email } 

end 

Но я получаю эту ошибку,

undefined method `email' for nil:NilClass 

Но я могу использовать это нормально в моем _header.html.erb Как так:

<a class="btn btn-primary dropdown-toggle" data-toggle="dropdown" href="#"> 
    <%= @current_user.email %> 
    <span class="caret"></span> 

@current_user описан в моем sessions_helper следующим образом:

module SessionsHelper 

    def sign_in(user) 
     cookies.permanent[:remember_token] = user.remember_token 
     current_user = user 
    end 

    def signed_in? 
     !current_user.nil? 
    end 

    def current_user=(user) 
     @current_user 
    end 

    def current_user 
     @current_user ||= User.find_by_remember_token(cookies[:remember_token]) 
    end 

    def current_user?(user) 
     user == current_user 
    end 

    def sign_out 
     current_user = nil 
     cookies.delete(:remember_token) 
    end 
end 

Почему я не могу выполнить это before_save, не получив эту ошибку? Спасибо, парни.

+0

У вас возникают те же ошибки, если вы получаете доступ к '@ current_user' методом' current_user' ('self.created_by = current_user.email' без' @ ')? –

+0

'неопределенная локальная переменная или метод' current_user 'для # <Маршрут: 0x007fc385eda0a8> ' – Datsik

+0

Возможно, вы захотите попробовать этот камень? https://github.com/house9/clerk - автоматически устанавливает создателя и обновителя на моделях – house9

ответ

0

В дополнение к моему комментарию, ваш SessionsHelper похож на to that of The Rails Tutorial. Учитывая это, я думаю, что у вас есть некоторые проблемы с вашими методами current_user и current_user=, поскольку они, похоже, делают противоположное. Они, вероятно, следует:

def current_user 
    @current_user ||= User.find_by_remember_token(cookies[:remember_token]) 
end 

def current_user=(user) 
    @current_user = user 
end 

Редактировать

The model should not know about controller or helper methods, так что вы можете захотеть установить @route.created_by = current_user.email где-то в соответствующем контроллере, прежде чем сохранить объект.

+0

Да, это то же самое из учебника по рельсам, но он все еще не работает. Я сделал исправления. – Datsik

+0

. Я не понимаю, почему я может использовать его в моем '_header.html.erb' просто отлично, но не в моем файле Route.rb. – Datsik

+0

Вы добавили' include SessionsHelper' в 'ApplicationController'? –

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