Jan*_*rik 7 ruby-on-rails ruby-on-rails-3
我使用语言代码作为前缀,例如www.mydomain.com/en/posts/1.这是我在routes.rb中所做的:
scope ":lang" do
resources :posts
end
Run Code Online (Sandbox Code Playgroud)
现在我可以轻松使用url helpers,例如:post_path(post.id, :lang => :en).问题是我想在cookie中使用一个值作为默认语言.所以我可以写post_path(post.id).
有没有办法如何在url helpers中设置参数的默认值?我找不到网址助手的源代码 - 有人能指出我正确的方向吗?
另一种方式:我已经尝试在routes.rb中设置它,但它仅在启动时评估,这对我不起作用:
scope ":lang", :defaults => { :lang => lambda { "en" } } do
resources :posts
end
Run Code Online (Sandbox Code Playgroud)
Ryan Bates在今天的railscast中报道了这一点:http: //railscasts.com/episodes/138-i18n-revised
你可以在这里找到url_for的来源:http://api.rubyonrails.org/classes/ActionDispatch/Routing/UrlFor.html
您将看到它将给定的选项与url_options合并,而url_options又调用default_url_options.
将以下内容作为私有方法添加到application_controller.rb中,您应该进行设置.
def locale_from_cookie
# retrieve the locale
end
def default_url_options(options = {})
{:lang => locale_from_cookie}
end
Run Code Online (Sandbox Code Playgroud)
小智 5
上面的 dosterr 几乎得到了它。那个版本的 default_url_options 不会与其他人相处得很好。您想要增加而不是传入的 clobber 选项:
def locale_from_cookie
# retrieve the locale
end
def default_url_options(options = {})
options.merge(:lang => locale_from_cookie)
end
Run Code Online (Sandbox Code Playgroud)
这是我脑子里的编码,所以不能保证,但在初始化程序中尝试一下:
module MyRoutingStuff
alias :original_url_for :url_for
def url_for(options = {})
options[:lang] = :en unless options[:lang] # whatever code you want to set your default
original_url_for
end
end
ActionDispatch::Routing::UrlFor.send(:include, MyRoutingStuff)
Run Code Online (Sandbox Code Playgroud)
或者直接猴子补丁...
module ActionDispatch
module Routing
module UrlFor
alias :original_url_for :url_for
def url_for(options = {})
options[:lang] = :en unless options[:lang] # whatever code you want to set your default
original_url_for
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
url_for 的代码位于 Rails 3.0.7 中的 actionpack/lib/routing/url_for.rb 中
| 归档时间: |
|
| 查看次数: |
4265 次 |
| 最近记录: |