2015-08-14 2 views
0

Существует вспомогательный метод в application_controller:Rails - вспомогательный метод в контроллере, доступный в модели?

def current_user 
     @current_user ||= User.find(session[:user_id]) 
     return @current_user 
    end 

Я хочу, чтобы настроить before_save обратного вызова в модели - так что current_user.id будут сохранены, когда ActiveRecord обновляется.

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

Но я не уверен, как получить доступ к текущему пользователю в модели?

Может ли кто-нибудь посоветовать?

+0

Что вы подразумеваете под вспомогательным методом в application_controller? –

+0

в верхней части application_controller есть эта строка: helper_method: current_user – user3437721

+0

Я считаю, что немного больше кода будет полезно. В частности, действие контроллера, которое вызывается. И модель, и это 'before_save'. –

ответ

0

Вы можете сделать что-то подобное для доступа переменная экземпляра, объявленная в контроллере от модели

class User < ActiveRecord::Base 
    cattr_accessor :current_user 
end 

class ApplicationController < ActionController::Base 
     before_filter :current_user 

     def current_user 
     @current_user ||= User.find(session[:user_id]) 
     User.current_user = @current_user 
    end 
    end 
end 
0

Это невозможно, current_user доступен только в контроллере. Вы должны пройти current_user идентификатор в методе, например:

В методе контроллера:

def action 
    method_with_user_id(current_user.id) 
end 

в определении класса модели:

def method_with_user_id(user_id) 
    #things with the user id 
end 
+0

Спасибо, я делаю это в настоящее время, но я хотел создать обратный вызов before_save, чтобы обновленный пользователь все обновился для этой модели, и мне не нужно называть методы везде – user3437721

+0

Что означает «чтобы обновленный пользователь все получал обновлено для этой модели "? –

0

Методы помощи недоступен для моделей только для просмотров.

Я думаю, что вместо того, чтобы настроить before_save в модели и передать current_user.id, я думаю, что существует связь между вашей моделью и пользователем, поэтому вы должны установить связь и передать объект пользователя в действие create этой модели.

И в вашем контроллере приложений у вас должно быть что-то вроде этого.

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 
    def current_user 
     @current_user ||= User.find(session[:user_id]) 
     return @current_user 
    end 
end 

И у вашего контроллера модели у вас есть доступ к этому методу.

def create 
    current_user.my_model.create(params_model) 
end 
0

Как вариант дизайна, его не рекомендуется вызывать помощников контроллера из ваших моделей. Модель не должна знать о своих контроллерах. Это не Railsy способ делать что-то.

Чтобы получить обходной путь вы можете установить переменную экземпляра @current_user в атрибуте класс вашего контроллера:

class ApplicationController < ActionController::Base 
    before_filter :set_current_user 
    def set_current_user 
    @current_user ||= User.find(session[:user_id]) 
    Account.current_user = @current_user 
    end 
end 

Тогда, в вашей модели:

class User < ActiveRecord::Base 
    cattr_accessor :current_user 
end 

Тогда просто напрямую обращаться к @current_user с Account.current_user в вашей модели.

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