我使用语言代码作为前缀,例如www.mydomain.com/en/posts/1
。这就是我在路线上所做的。rb:
scope ":lang" do
resources :posts
end
现在我可以很容易地使用url帮助程序,例如:post_path(post.id, :lang => :en)
。问题是,我想使用cookie中的值作为默认语言。所以我可以只写post_path(post.id)
。
有没有办法在url帮助程序中设置参数的默认值?我找不到url助手的源代码——有人能给我指明正确的方向吗?
另一种方式:我已经尝试在routes.rb中设置它,但它只在启动时进行评估,这对我不起作用:
scope ":lang", :defaults => { :lang => lambda { "en" } } do
resources :posts
end
Ryan Bates在今天的railscast中介绍了这一点:http://railscasts.com/episodes/138-i18n-revised
您可以在此处找到url_fo的来源:http://api.rubyonrails.org/classes/ActionDispatch/Routing/UrlFor.html
您将看到它将给定的选项与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
下面的doesterr
几乎做到了。那个版本的default_url_options
不会和其他人玩得很好。您想要增强而不是破坏传入的选项:
def locale_from_cookie
# retrieve the locale
end
def default_url_options(options = {})
options.merge(:lang => locale_from_cookie)
end
这是我头脑中的编码,所以不能保证,但请尝试初始化器:
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)
或者直接猴子补丁。。。
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
url_fo的代码位于Rails 3.0.7 中的actionpack/lib/routing/url_for.rb中