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

我能想到的第二种方法是在控制器中使用前/后过滤器来影响参数,然后再将它们传递给模型。

...

于 2012-10-05T12:12:16.393 回答
1

如果您想在创建操作后更新某些内容但不更新操作,请参见示例

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

创建操作后调用上述方法xyz 。当更新调用时,它不会调用。

于 2012-10-05T12:25:19.390 回答
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 回答
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 回答