在Rails中使用Shrine上传图片并在文章中调用,你需要遵循以下步骤:
首先,你需要安装Shrine gem并在你的Rails应用中进行配置。
在你的Gemfile
中添加Shrine:
gem 'shrine'
然后运行bundle install
。
创建一个新的初始化文件来配置Shrine:
rails generate shrine:install
这将会创建一个config/initializers/shrine.rb
文件,你可以在这里配置你的存储服务(例如本地文件系统、Amazon S3等)。
例如,配置本地存储:
Shrine.storages = {
cache: Shrine::Storage::FileSystem.new('public', prefix: 'uploads/cache'),
store: Shrine::Storage::FileSystem.new('public', prefix: 'uploads'),
}
创建一个处理器来处理图片上传:
rails generate shrine:processor ImageProcessor
在生成的处理器中,你可以添加图片处理的逻辑,例如使用ImageMagick或MiniMagick。
在你的文章模型中附加Shrine:
class Article < ApplicationRecord
include Shrine::Attachment.new(:image)
end
添加一个迁移来创建articles
表并包含图片字段:
rails generate migration AddImageToArticles image:string
运行迁移:
rails db:migrate
在你的文章表单中添加图片上传字段:
<%= form_with model: @article, local: true do |form| %>
<%= form.label :image %>
<%= form.file_field :image %>
<%= form.submit %>
<% end %>
在你的文章控制器中处理图片上传:
class ArticlesController < ApplicationController
def create
@article = Article.new(article_params)
if @article.save
redirect_to @article, notice: 'Article was successfully created.'
else
render :new
end
end
private
def article_params
params.require(:article).permit(:title, :content, :image)
end
end
在你的文章视图中显示上传的图片:
<%= image_tag @article.image_url(:medium) %>
这里:medium
是你在Shrine配置中定义的一个图片变体。如果你没有定义任何变体,你可以直接使用:original
。
如果你需要不同尺寸的图片,可以在Shrine的初始化文件中配置图片变体:
Shrine.plugin :derivatives
Shrine.plugin :derivation_endpoint
Shrine.derivatives[:medium] = ->(io, context) {
io.download do |original|
MiniMagick::Tool.new('convert').call(original.path, '-resize', '300>', original.path)
end
}
确保你已经安装了MiniMagick gem:
gem 'mini_magick'
然后在你的模型中使用这些变体:
class Article < ApplicationRecord
include Shrine::Attachment.new(:image, versions: { medium: Shrine::Derivative[:medium] })
end
这样,你就可以在文章中调用通过Shrine上传的图片了。记得在实际部署时配置适当的存储服务,例如Amazon S3,以确保图片的安全存储和高效访问。
领取专属 10元无门槛券
手把手带您无忧上云