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

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)

doe*_*err 6

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)


jdc*_*jdc 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)
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 中