ruby-on-rails 如何设置url helper方法的参数的默认值?

yhived7q  于 2022-11-19  发布在  Ruby
关注(0)|答案(3)|浏览(127)

我使用语言代码作为前缀,例如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助手中设置参数的默认值?我找不到url助手的源代码-有人能给我指个路吗?
另一个道:我已经尝试在routes.rb中设置它,但它只在启动时评估,这对我不起作用:

scope ":lang", :defaults => { :lang => lambda { "en" } } do
  resources :posts
end
myss37ts

myss37ts1#

瑞安贝茨涵盖了这一点在今天的铁路广播: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
pkmbmrz7

pkmbmrz72#

下面的doesterr几乎已经得到了它。该版本的default_url_options与其他版本不兼容。您希望增加而不是破坏传入的选项:

def locale_from_cookie
  # retrieve the locale
end
    
def default_url_options(options = {})
  options.merge(:lang => locale_from_cookie)
end
8ehkhllq

8ehkhllq3#

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

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

在Rails 3.0.7中,url_for的代码位于actionpack/lib/routing/url_for.rb中

相关问题