【问题标题】:Checking the referer of 'path/:id'检查 'path/:id' 的引用者
【发布时间】:2014-05-27 12:19:18
【问题描述】:

我有一个标准资源:

resources :customers

在“显示”页面 (/customers/:id) 上有一个指向其他客户的链接。当我点击它时,我如何检查referer是否为/customers/:id页面?我试图这样做:

[1] pry(#<CustomersController>)> URI(request.referer).path
=> "/customers/88" # previous ulr

[2] pry(#<CustomersController>)> customer_path
=> "/customers/98" # current url

但它不起作用。也就是说,/customers/:id中的:id总是在变化,那么如何判断URI(request.referer).path是否属于customer_path呢?

if URI(request.referer).path == ??? #???

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 ruby-2.1


    【解决方案1】:

    这可行,但远非漂亮。然而,它非常灵活,并且在生成的 url 助手上进行中继,因此如果您决定更改 url 映射,则不应中断。

    if URI(request.referer).path =~ Regexp.new(customer_path(':customer_id').gsub(':customer_id', '\d+'))
    

    更多、更多、更好的解决方案:

    Rails 应用程序已经有一种方法可以识别路径并通过控制器/动作返回:

    Rails.application.routes.recognize_path(URI(request.referer).path)
    #=> {:controller => 'customers', :action => 'show', :id => '88'}
    

    你可以用它来写一个辅助方法:

    def is_referer_customer_show_action?
      referer_url = Rails.application.routes.recognize_path(URI(request.referer).path)
      referer_url[:controller] == 'customers' && referer_url[:action] == 'show'
    end
    

    【讨论】:

    • is_referer_customer_show_action 似乎是硬编码。有没有更好的办法?
    • 如果你不想,你不需要把它包装成一个方法。您可以调用recognize_path 方法,然后检查它的控制器和操作键。
    • 你误解了我的意思。我说'customers'和'show'是硬编码的,不好。
    • @Alex - 我想我做到了。我以为您想知道referer 是否是某个控制器的某种操作。如果不使用控制器名称和操作名称,您还想怎么做呢?
    • 我不知道,也许用了一些抽象。
    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    相关资源
    最近更新 更多