如何设置url helper方法参数的默认值?

时间:2011-06-08 15:47:02

标签: ruby-on-rails ruby-on-rails-3

我使用语言代码作为前缀,例如www.mydomain.com/en/posts/1。 这就是我在routes.rb中所做的:

scope ":lang" do
  resources :posts
end

现在我可以轻松使用网址助手,例如: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

3 个答案:

答案 0 :(得分:6)

Ryan Bates在今天的railscast中提到了这一点:http://railscasts.com/episodes/138-i18n-revised

您可以在此处找到url_for的来源: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

答案 1 :(得分:4)

上面的几乎已经得到了它。那个版本的default_url_options不会和其他人一起玩。你想要增加而不是传入的clobber选项:

def locale_from_cookie
  # retrieve the locale
end

def default_url_options(options = {})
  options.merge(:lang => locale_from_cookie)
end

答案 2 :(得分:3)

这是我头脑中的编码,所以不能保证,但在初始化器中尝试一下:

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_for的代码位于Rails 3.0.7中的actionpack / lib / routing / url_for.rb