【问题标题】:Get root_url in a Rails service在 Rails 服务中获取 root_url
【发布时间】:2016-05-10 12:33:15
【问题描述】:

我正在开发的应用大量使用了Rails services。我的问题是我需要获取应用程序的根 url,类似于在视图中使用 root_url 的方式,但这在服务中不起作用。除了在我的每个环境设置文件中输入 url 之外,有谁知道这样做的方法?

编辑

我尝试使用Rails.application.routes.url_helpers.root_url,因为它建议在这里使用stackoverflow.com/a/5456103/772309,但它希望您将:host => ... 作为参数传递。这就是我试图找到的。

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

根据我从链接的“Rails 服务”文章中读到的内容,这些服务只是普通的旧 ruby​​ 对象。如果是这种情况,那么您需要将 root_url 从控制器传递给服务对象的初始化程序。要扩展该文章中的示例:

用户控制器

class UsersController < ActionController::Base
  ...
  private
  ...

  def register_with_credit_card_service
    CreditCardService.new({
      card: params[:stripe_token],
      email: params[:user][:email],
      root_url: root_url
    }).create_customer
  end
end

信用卡服务

class CreditCardService
  def initialize(params)
    ...
    @root_url = params[:root_url]
  end
end

编辑:利用 Rails.application.config 的替代解决方案

class UsersController < ActionController::Base
  before_filter :set_root_url

  def set_root_url
    Rails.application.config.root_url = root_url
  end
end

class CreditCardService
  def some_method
    callback_url = "#{Rails.application.config.root_url}/my_callback"
  end
end

【讨论】:

  • 这绝对是一种方法,是的,服务只是普通的 ruby​​ 对象。我当前用例的问题是我必须将它通过多个服务传递到单独的服务器并返回,显然不是最优雅的解决方案。但是,您的答案最适合大多数情况。
  • 明白了,然后看看我包含的编辑。我再次使用了 UserController,因为那是文章中的原始示例。我通常从 ApplicationController 开始,并让我的所有其他控制器扩展它。我会在那里添加 before_filter,它将为所有路由设置 config.root_url。
【解决方案2】:

由于您反对将其放在环境文件夹中,因此您可以在应用控制器中执行以下操作

class ApplicationController < ActionController::Base
  def default_url_options
    if Rails.env.production?
      {:host => "myproduction.com"}
    else  
      {}
    end
  end
end

【讨论】:

  • 我不反对把它放在我的环境文件夹中,只是希望有一个本地 Rails 方法我可以调用来获取主机名。它看起来像我的环境设置是要走的路。
猜你喜欢
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 2015-09-10
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多