【问题标题】:How to bypass default_url_options?如何绕过 default_url_options?
【发布时间】:2012-07-13 23:30:35
【问题描述】:

在我的上一个 Rails 项目中,我必须在 application_controller.rb 中覆盖 default_url_options 以始终通过每个请求传递一个参数,如下所示:

def default_url_options 
  { :my_default_param => my_param_value }
end  

现在每个 url 助手都会在每个生成的 url 的末尾附加一个 my_default_param。 例如user_url(@current_user) 会生成一个 url,如:

http://www.example.com/users/1?&my_default_param=my_param_value 

但有时我需要在没有 my_default_param 的情况下生成 url。是否有一些选项可以传递给 url 帮助程序,以便 user_url(@current_user, some_option: some_option_value) 只返回:

http://www.example.com/users/1?&my_default_param=my_param_value

PN:我已经尝试过使用:overwrite_params=> { },但它不起作用,可能是因为它在 default_url_options 之前进行了评估。

如果没有,是否有其他方法可以在不附加 my_default_param 的情况下获取 @current_user url?

谢谢。

【问题讨论】:

  • 如果你想覆盖default_url_options,你就不能这样做:user_url(id: @current_user, my_default_param: nil)?

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


【解决方案1】:

default_url_options has one param options 你可以随意使用:

def default_url_options( options = {} )

  use_defaults = options.delete( :use_defaults )

  if use_defaults
    { :my_default_param => 'my_param_value' }
  else
    {}
  end

end

或者你可以颠倒逻辑:

def default_url_options( options = {} )

  ignore_defaults = options.delete( :ignore_defaults )

  if ignore_defaults
    {}
  else
    { :my_default_param => 'my_param_value' }
  end

end

【讨论】:

  • 谢谢,但我不能让它工作,我应该如何调用user_url(@current_user) 来忽略默认值? (我更喜欢颠倒的逻辑)
  • 我尝试使用user_url(@current_user, ignore_defaults: true),但它不起作用。请问有什么办法吗?
  • 讽刺的是,它生成了一个带有?my_default_param=my_param_value&ignore_defaults=true的网址...我错过了什么?
  • 嗯,好像是很久以前的事了。如果您仍然需要答案 - 我在上面为您应该添加到您的初始化程序中的 rails 方法提供了猴子补丁。通常,您应该为 ActionDispatch::Routing::Mapper::Base 覆盖 default_url_options
猜你喜欢
  • 2021-11-04
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
相关资源
最近更新 更多