1

我试图在控制器、视图和模型中共享一个会话变量。

使用以下代码,它在控制器和视图中工作:

class ApplicationController < ActionController::Base
    protect_from_forgery
    helper_method :best_language_id

    # Returns the ID of the language to use to display the description.
    def best_language_id
        @best_language_id ||= session[:best_language_id]
        @best_language_id ||= current_project.default_language.id
        return @best_language_id
   end
end

但我不能从模型中调用它。

我希望能够在控制器、视图和一个模型中调用 best_language_id,以在未找到翻译时获得 best_language_id 的后备。

我的模型中的示例(不工作):

class Point < ActiveRecord::Base
    # Retuns the attached word in the given language if exists. 
    # Otherwise, falls back on another translation
    def word(preffered_language_id)
        word = Word.find(:translation_id => self.translation_id, :language_id => preffered_language_id)
        if word.blank?
            word = translations.where(:translation_id => self.translation_id, :language_id => best_language_id)
        end
        return word
    end
end

我知道模型不应该包括 applicationcontroller 方法调用,但是如何在控制器和模型之间共享我的 best_language_id 呢?

编辑:使用 i18n 不是这里的问题。翻译不是固定的字符串,而是数据库中的变量。

感谢您的帮助!

4

2 回答 2

1

我建议您切换情况,将 best_language_id 作为类访问器存储在模型中,然后您可以从控制器中设置和获取它,它仍然可以在模型中使用。

class Point < ActiveRecord::Base
  cattr_accessor :best_language_id # to store the variable
end

# Persist the content of that variable at the start of every action
class ApplicationController < ActionController::Base 
  before_filter :set_best_language

  def set_best_language
    Point.best_language_id = session[:best_language_id]
    Point.best_language_id ||= current_project.default_language.id
  end
end

# Use the variable in a controller
class SomeOtherController < ActionController::Base
  def show
    @best_language = Language.find(Point.best_language_id)
    ...
  end
end

# Use the variable in a model
class SomeOtherController < ActiveRecord::Base
  def some_method
    best_language = Language.find(Point.best_language_id)
    ...
  end
end
于 2013-06-11T08:31:35.687 回答
1

在您的 rails 应用程序中,您在 config/application.rb 中有一个基本模块。它应该以您的应用程序命名。假设它称为 MyApp。你可以做的是定义两个这样的方法:

module MyApp
  ...
  def self.language_id=(value)
    @language_id = value
  end

  def self.language_id
    @language_id ||= 'en' # default vaule
  end
  ...
end

然后,在 app/controllers/application_controller.rb 添加一个 before_filter 像这样:

before_filter :language
def language
  MyApp.language_id = session[:language_id] if session[:language_id] 
end

然后,从整个应用程序中,您可以通过以下方式访问该值

MyApp.language_id

不用说这种方法不是线程安全的,所以不要在线程环境中使用它。

于 2013-06-11T08:36:27.400 回答