2011-05-23 37 views
17

由于ActionController :: Base#default_url_options已被弃用,我不知道如何在rails3中设置默认的url选项。默认的url选项不是静态的,而是取决于当前的请求。default_url_options和rails 3

http://apidock.com/rails/ActionController/Base/default_url_options

感谢, 科林

+0

'的ActionController ::基地#default_url_options' [*不是*弃用(http://edgeguides.rubyonrails.org/action_controller_overview.html#default:

这是从轨道3指南适于-url选项)。 – Mohamad 2015-08-01 14:10:13

回答

24

要为当前请求使用这样的网址选项控制器:

class ApplicationController < ActionController::Base 

    def url_options 
    { :profile => current_profile }.merge(super) 
    end 

end 

现在:配置=> CURRENT_PROFILE将automerge到路径/ URL参数。

示例路由:

scope ":profile" do 
    resources :comments 
end 

只要写:

comments_path 

如果CURRENT_PROFILE已成立to_param为 '卢卡斯':

/lucas/comments 
+0

谢谢!这是“官方”导轨3.0/3.1的方式吗? – gucki 2011-06-05 19:34:20

+0

太糟糕了,它在声明为受保护的时候会引发异常(否则它会作为操作公开)。所以它不起作用。 – gucki 2011-06-06 17:33:39

+4

它适用于我在真实项目中,我不知道为什么你认为它作为一个动作公开,只是从你的路线中删除默认路由/:控制器/(:行动)。这种方法必须是公开的。 – 2011-06-08 16:33:39

24

我认为首选的方法是现在告诉路由器来处理:

Rails.application.routes.default_url_options[:foo]= 'bar' 

你可以把此行要么routes.rb或初始化。无论你喜欢什么。如果值根据您的环境而改变,您甚至可以将其放入环境配置中。

+1

但我怎么能使这依赖于当前的请求,所以例如访问实例变量? – gucki 2011-05-23 18:23:17

+0

叶,它不是线程安全的。我通过自定义方法和Thread.current做了 – 2011-08-15 17:05:55

+2

看起来这是Rails 3.2的。 – aceofspades 2012-03-19 18:34:56

0

对于Rails 3中明确,规范的方式来做到这一点是通过添加default_url_options方法您ApplicationController

class ApplicationController < ActionController::Base 
    def default_url_options 
    { 
     :host => "corin.example.com", 
     :port => "80" # Optional. Set nil to force Rails to omit 
         # the port if for some reason it's being 
         # included when you don't want it. 
    } 
    end 
end 

我只是自己弄清楚了这一点,所以我知道它的工作原理。
http://guides.rubyonrails.org/v3.2.21/action_controller_overview.html#default_url_options