0

保存する前にいくつかのフィールドをチェックして、デフォルトのブラウザー言語に変更したいと考えています。

before_save フィルターを使用したい:

def update
 @website = Website.find(params[:id])
  if @website.language == "Automatic (by user's browser language)"
   @website.language = full_language(request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first)
 end
respond_to do |format|
  if @website.update_attributes(params[:website])
    format.html { redirect_to @website, 
      notice: 'Note: code has been updated. Please replace the code you have on your website with the code below. Only then changes will take effect.'}
    format.js
   end
  end
end

確認する必要があります:

  if @website.language == "Automatic (by user's browser language)"
    @website.language = full_language(request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first)
 end

また、作成アクションでは機能しますが、更新では機能しません。

これどうやってするの ?

4

4 に答える 4

1

保存前はモデルで使用され、リクエストは通常​​モデルでは使用できません。

ただし、本当にそれを行いたい場合は、http: //m.onkey.org/how-to-access-session-cookies-params-request-in-modelを確認して、その方法の詳細を確認してください。

- 編集 -

それを行うにはいくつかの方法があります。

最初に頭に浮かんだのは、モデルに追加してから、コントローラーからモデルattr_accessor :request_languageに渡すことです:request.env['HTTP_ACCEPT_LANGUAGE']

if @website.update_attributes(params[:website])
  @website.request_language = request.env['HTTP_ACCEPT_LANGUAGE']
  # ...

これで、以前と同じように、いくつかの変更を加えて続行できます。

def auto_language
    if self.language == "Automatic (by user's browser language)"
         self.language = full_language(self.request_language.scan(/^[a-z]{2}/).first)
    end
 end

私が考えることができる2番目の方法は、モデルに渡される前にパラメーターに影響を与えるためにコントローラーで前後のフィルターを使用することです。

...

于 2012-10-05T12:12:16.393 に答える
1

アクションの作成後に何かを更新したいが、アクションを更新したくない場合は、例を参照してください

# write in your model
after_create :xyz
def xyz
 ...
 ...
end

上記のメソッドxyz呼び出しは、アクションの作成後に行われます。update を呼び出すと、呼び出されません。

于 2012-10-05T12:25:19.390 に答える
0

:languageハッシュ内のの値を変更する必要がありparamsます。これは、最終的に に渡すものだからです@website.update_attributes。また、コントローラー コードを読みやすくするために、その条件をモデル レイヤーに移動することをお勧めします。

# app/controllers/websites_controller.rb
def update
  @website = Website.find(params[:id])
  if @website.language_automatic?
    params[:website][:language] = full_language(request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first)
  end
  respond_to do |format|
    if @website.update_attributes(params[:website])
      format.html { redirect_to @website, 
        notice: 'Note: code has been updated. Please replace the code you have on your website with the code below. Only then changes will take effect.'}
      format.js
    end
  end
end

# app/models/website.rb
def language_automatic?
  language == "Automatic (by user's browser language)"
end
于 2012-10-05T12:31:44.223 に答える
0

requestオブジェクトはモデルでは使用できません。これらの調整は、コントローラー レイヤーで行う必要があります。

def action
    if @model.language == "Automatic (by user's browser language)"
         @model.language = full_language(request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first)
    end
    if @model.save
        ... 
    else
        ...
    end
end

private

def full_language
  ...
end
于 2012-10-05T12:11:43.013 に答える