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

しかし、モデルから呼び出すことはできません。

コントローラー、ビュー、および 1 つのモデルで 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 に答える