我有一个rails应用程序。我正在使用gem:paperclip将照片上传到我的服务器。我要做的是使用perams哈希中的信息在服务器上创建一个文件夹结构。请参阅下面的代码。
photo controller.rb
# POST /photos
# POST /photos.json
def create
@photo = Photo.new(params[:photo])
@photo.lat = params["photo%5Blat%5D"].to_s
@photo.lng = params["photo%5Blng%5D"].to_s
@photo.description = params[:description]
@photo.takenby = params[:takenby].to_s
@photo.save
puts "photos/create photos.inspect= #{@photo.inspect}"
end
photo.rb
class Photo < ActiveRecord::Base
attr_accessible :lat, :lng, :image
vendor = params[:description]
owner = params[:owner]
Paperclip.interpolates :prefix do |attachment, style|
"#{owner}/#{Date.today.to_s }/#{vendor}"
end
has_attached_file :image,
:path => ":prefix/:basename.:extension",
:styles => { :thumbnail => "57x57", :original => "100x100" },
:storage => :s3,
:s3_credentials => S3_CREDENTIALS
但是,我在服务器控制台上收到此错误。
Started GET "/photos?lat=37.785834&lng=-122.406417" for 127.0.0.1 at 2012-09-26
21:08:57 -0700
21:08:57 web.1 | Processing by PhotosController#index as JSON
21:08:57 web.1 | Parameters: {"lat"=>"37.785834", "lng"=>"-122.406417"}
21:08:57 web.1 | Completed 500 Internal Server Error in 4ms
21:08:57 web.1 | NameError (undefined local variable or method `params' for #<Class:0x007fb7d4fa3320>):
21:08:57 web.1 | app/models/photo.rb:23:in `<class:Photo>'
21:08:57 web.1 | app/models/photo.rb:18:in `<top (required)>'
21:08:57 web.1 | app/controllers/photos_controller.rb:14:in `index'
我需要在模型中更改哪些内容,以便回形针使用正确的文件夹结构将图像保存在服务器上?
这解决了我的问题:
photo.rb
Paperclip.interpolates :prefix do |attachment, style|
"#{attachment.instance.takenby}/#{Date.today.to_s }/#{attachment.instance.description}"
end
但这引入了一个新问题。我不能再保存不同大小的图像了。我该怎么做?
答案 0 :(得分:3)
你不能通过这种方式访问你班级中的params哈希:
vendor = params[:description]
owner = params[:owner]
描述示例:
1)首先,创建一个config / initializers / paperclip.rb文件并添加以下内容:
Paperclip.interpolates :description do |attachment, style|
attachment.instance.description # or other attribute
end
2)然后,
has_attached_file :image,
:path => ":description/:basename.:extension",
:styles => { :thumbnail => "57x57", :original => "100x100" },
:storage => :s3,
:s3_credentials => S3_CREDENTIALS
3)阅读这篇文章了解更多信息:
答案 1 :(得分:0)
你无法直接访问模型中的参数。如果你想访问它们,你可以将params作为参数传递给模型中声明的方法。
在控制器中,执行
obj.set_values(params)
在模型中,做
def set_values(params)
self.vendor = params[:description]
self.owner = params[:owner]
end
在保存模型之前调用插值代码。
答案 2 :(得分:0)
params
无法从您的模型访问,因此这些分配将失败。
如果供应商和所有者是Photo的属性,只需在创建操作中分配它们即可。您可能希望修改表单,以便可以在params[:photo]
中找到Photo模型的所有值,以减少不必要的分配。
答案 3 :(得分:0)
$ rails g paperclip post photo
$ rake db:migrate
转到Post.rb并添加:
attr_accessible:照片 has_attached_file:photo,:styles =&gt; {:small =&gt; '150x150',: normal =&gt; '400x400'},:path =&gt; “:rails_root / public / system /:attachment /:id /:style /:filename”,:url =&gt; “/系统/:附接/:ID /:风格/:文件名”
打开你的_form.html.erb并重写是:
<%= form_for (@post) do |f| %>
为:
<%= form_for @post, :html => { :multipart => true } do |f| %>
并在此添加_form this:
<p>
<%= f.file_field :photo %>
</p>
Index.html.erb中的:
在Show.html.erb中: