【问题标题】:How can I access current host and port on a model in Rails?如何在 Rails 中访问模型上的当前主机和端口?
【发布时间】:2013-12-06 18:09:38
【问题描述】:

我面临以下问题:

我正在做一个 Rails 4 网络应用程序,我们正在使用回形针作为个人资料图像。如果用户不上传图片,我们会提供默认图片(如 facebook 剪影占位符)。因此,由于回形针可以轻松处理默认图像,我们在 Profile 模型中执行以下操作:

class Profile < ActiveRecord::Base
  belongs_to :user
  has_attached_file :image, :styles => { :medium => "300x300", :thumb => "100x100" }, :default_url => "assets/profiles/:style/placeholder.gif"
end

最大的问题是我需要图像的完整 URL 而不仅仅是路径,所以我很难在该路径之前获取主机和端口。使用操作视图助手没有帮助(asset_url helper)

我正在考虑为每个环境初始化一些常量或配置或环境变量。会正确吗?还有其他建议吗?

编辑:我忘了提到这一点:资源(配置文件)可能有自定义图片或默认图片。当它具有自定义图像时,我们将其存储在 Amazon S3 中,在这种情况下,profile.image.url 返回完整 URL。在另一种情况下,当它没有自定义图片时,它会存储一个默认图像in app/assets/images,在这种情况下profile.image.url 只返回路径。我希望 image.url 方法始终返回完整的 URL。 – flyer88 刚刚编辑

【问题讨论】:

标签: ruby-on-rails ruby model paperclip host


【解决方案1】:

如您在评论中提到的,如果您提供 API 端点,则在控制器中确定主机、端口等可能更有意义。像这样的:

# routes.rb
get "/profile/:id" => "api#profile"

# profile.rb
def image_url_or_default request
  if image
    "#{request.protocol}#{request.host_with_port}#{image.url}"
  else
    "http://s3.amazon.com/my_bucket/default.jpg"
  end
end

# api_controller.rb
def profile
  profile = Profile.find params[:id]
  render text:profile.image_url_or_default(request)
end

profile.image.url 将是图片的完整 URL。

【讨论】:

  • 我刚刚测试了在控制器中获取图像 url,它仍然向我抛出路径(对于默认图像)。我需要完整的网址
  • 现在您在控制器中,您可以访问请求对象,因此您可以使用 request.protocol 和 request.host_with_port 来创建完整的 URL,如下所示:“#{request.协议}#{request.host_with_port}#{profile.image.url}"(更新答案)
  • 是的,我注意到了,谢谢。无论如何,我不确定我想要这个解决方案。我在 rabl.json 模板中将响应呈现为 json,并且我有一个键 {profile_image_url: ...} 以及其他值。我希望将模型中的完整 URL 作为回形针的默认路径。以您的方式,我需要在控制器@image_url = profile.image.present? ? profile.image.url : "#{request.host_with_port}#{profile.image.url}" 中设置一个实例变量。问题是,当资源没有 s3 图像时,它使用默认的,而默认的仅呈现路径而不是完整的 URL。
  • 我没有在我的问题中提到我的问题中最重要的事情。问题是资源 (Profile) 可能有自定义图片或默认图片。当它具有自定义图像时,我们将其存储在 Amazon S3 中,在这种情况下,profile.image.url 返回完整 URL。在另一种情况下,当它没有自定义图片时,它会在 app/assets/images 中存储一个默认图像,在这种情况下,profile.image.url 只返回路径。我希望 image.url 方法始终返回完整的 URL。
  • 我建议在控制器中“计算” URL 的原因是您可以访问那里的请求对象,该对象具有为请求提供服务的服务器的协议和主机。您可以将该信息存储在从模型访问的某种设置文件中,但如果您将应用程序移动到另一台服务器或更改服务器的主机名,您也必须更改配置。在控制器中使用 request 变量可以让您自动获取该信息。您可以将请求传递给模型,例如 profile.image_url_or_default(request)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 2019-03-15
相关资源
最近更新 更多