Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何从模型中引用资产管道中的图像?_Ruby On Rails_Ruby On Rails 3_Ruby On Rails 3.1_Asset Pipeline - Fatal编程技术网

Ruby on rails 如何从模型中引用资产管道中的图像?

Ruby on rails 如何从模型中引用资产管道中的图像?,ruby-on-rails,ruby-on-rails-3,ruby-on-rails-3.1,asset-pipeline,Ruby On Rails,Ruby On Rails 3,Ruby On Rails 3.1,Asset Pipeline,我有一个模型,其中有一个方法可以将url返回到一个人的头像,如下所示: def avatar_url if self.avatar? self.avatar.url # This uses paperclip else "/images/avatars/none.png" end end 我正在升级到3.1,因此现在需要通过资产管道引用硬编码的none映像。在控制器或视图中,我只是将其包装在image\u path()中,但在模型中没有该选项。如何生成

我有一个模型,其中有一个方法可以将url返回到一个人的头像,如下所示:

 def avatar_url
   if self.avatar?
     self.avatar.url # This uses paperclip
   else
     "/images/avatars/none.png"
   end
 end

我正在升级到3.1,因此现在需要通过资产管道引用硬编码的none映像。在控制器或视图中,我只是将其包装在
image\u path()
中,但在模型中没有该选项。如何生成图像的正确url?

就我个人而言,我认为您不应该将此默认设置放在模型中,因为它是一个视图细节。在您的(haml)视图中:

或者,创建自己的帮助器并按如下方式使用:

= avatar_or_default(@image)

当rails中出现类似的问题时,这通常是一个不完全正确的迹象。

曲别针可以选择指定默认url

has_attached_file :avatar, :default_url => '/images/.../missing_:style.png'

如果用户尚未上传头像,您可以使用此服务提供默认图像。

我们使用draper解决了此问题:。Draper让我们在模型(用于视图)周围添加一个包装器,以便访问帮助程序。

我在一段时间内一直在努力解决这个问题,所以我想我应该在这里发布答案。虽然上述方法适用于标准默认图像(即每个回形针样式使用相同的图像),但如果需要多个默认样式,则需要不同的方法

如果您希望默认url与资产管道和资产同步配合良好,并且希望每个样式具有不同的默认图像,那么您需要生成不带指纹的资产路径,否则您将收到大量资产未预编译错误

像这样:

   :default_url => ActionController::Base.helpers.asset_path("/missing/:style.png", :digest => false)
或者在您的回形针选项中:

   :default_url => lambda { |a| "#{a.instance.create_default_url}" }
然后是模型中具有回形针附件的实例方法:

def create_default_url
   ActionController::Base.helpers.asset_path("/missing/:style.png", :digest => false)
end
在这种情况下,您仍然可以使用插值(:样式),但必须关闭资产指纹识别/摘要


只要您同步没有摘要的资产以及有摘要的资产,这一切似乎都可以正常工作。

使用rails active storage,我通过这样做解决了这个问题:

# Post.rb
def Post < ApplicationRecord
    has_one_attached :image

    def thumbnail
        self.image.attached? ? self.image.variant(resize: "150x150").processed.service_url : 'placeholder.png';
    end

    def medium
        self.image.attached? ? self.image.variant(resize: "300x300").processed.service_url : 'placeholder.png';
    end

    def large
        self.image.attached? ? self.image.variant(resize: "600x600").processed.service_url : 'placeholder.png';
    end
end
#Post.rb
def Post<应用程序记录
是否附加了一张图片
def缩略图
self.image.attached?self.image.variant(调整大小:“150x150”).processed.service_url:'placeholder.png';
结束
def介质
self.image.attached?self.image.variant(调整大小:“300x300”).processed.service_url:'placeholder.png';
结束
def大型
self.image.attached?self.image.variant(大小:“600x600”).processed.service_url:'placeholder.png';
结束
结束
然后在您的观点中,只需调用:

但是我经常在json中使用它(通过as_json),这会取消该选项。不幸的是,默认的_url参数也不会通过资产管道帮助程序进行处理。您可以执行
:默认的_url=>ActionController::Base.helpers.image_path(“/default_avatar.png”)
很好的建议。这个gem看起来很有希望。我相信Draper只是让我们更容易获得与上面提到的@iain相同的helper方法。引入Draper只是为了让您能够访问辅助对象,这是一种过分的做法,但如果将其他逻辑移到演示者中是有意义的,那么一定要这样做。另一个选项:Rails 4,回形针,这不再是必要的<代码>:default\u url=>“:style/missing.jpg”。无前导
/
# Post.rb
def Post < ApplicationRecord
    has_one_attached :image

    def thumbnail
        self.image.attached? ? self.image.variant(resize: "150x150").processed.service_url : 'placeholder.png';
    end

    def medium
        self.image.attached? ? self.image.variant(resize: "300x300").processed.service_url : 'placeholder.png';
    end

    def large
        self.image.attached? ? self.image.variant(resize: "600x600").processed.service_url : 'placeholder.png';
    end
end