【发布时间】:2012-12-09 07:20:15
【问题描述】:
我正在使用 Carrierwave & Fog 将图像 str8 推送到 S3。
创建操作运行良好。问题是每当我去更新记录时,比如更改 name 属性,并且我不对图像字段做任何事情,我都会收到如下所示的错误:
Started PUT "/vendors/7" for 67.230.41.62 at 2012-12-09 07:00:51 +0000
2012-12-09T07:00:51+00:00 app[web.1]: app/controllers/vendors_controller.rb:65:in `update'
2012-12-09T07:00:51+00:00 app[web.1]: NoMethodError (undefined method `thumb_image_changed?' for #<Vendor:0x00000005940750>):
2012-12-09T07:00:51+00:00 app[web.1]:
2012-12-09T07:00:51+00:00 app[web.1]: app/controllers/vendors_controller.rb:66:in `block in update'
我的VendorsController#update 看起来很正常:
def update
@vendor = Vendor.find(params[:id])
respond_to do |format|
if @vendor.update_attributes(params[:vendor])
format.html { redirect_to @vendor, notice: 'Vendor was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @vendor.errors, status: :unprocessable_entity }
end
end
结束
违规行是update_attributes。
这是我的views/vendors/_form.html.erb
<%= simple_form_for(@vendor) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<div class="span8">
<%= f.input :name, :label => "Vendor Name", :wrapper_html => { :class => "span6" } %>
</div>
<div class="span8">
<%= f.input :intro_text, :label => "The headline for your storefront", :as => :text, :wrapper_html => { :class => "span6" }, :input_html => { :rows => 1 } %>
</div>
<div class="span8">
<%= f.input :description, :label => "The description of your store", :as => :text, :wrapper_html => { :class => "span6" }, :input_html => { :rows => 5 } %>
</div>
<div class="span8">
<%= f.input :banner_image, :label => "Upload Banner", :wrapper_html => { :class => "span6" } %>
</div>
<div class="span8">
<%= f.input :logo_image, :label => "Upload Logo", :wrapper_html => { :class => "span6" } %>
</div>
<div class="span8">
<%= f.button :submit, :class => "btn", :wrapper_html => { :class => "span6" } %>
</div>
</div> <!-- /.form-inputs -->
<% end %>
不管怎样,我的image_uploader.rb 中的图像尺寸之一是thumb:
version :thumb, :from_version => :main_banner do
process :resize_to_limit => [170, 120]
end
关于如何解决此问题的想法?
编辑 1
Vendor 模型:
class Vendor < ActiveRecord::Base
attr_accessible :name, :description, :banner_image, :logo_image, :intro_text, :thumb_image
mount_uploader :banner_image, ImageUploader
mount_uploader :logo_image, ImageUploader
mount_uploader :thumb_image, ImageUploader
acts_as_tagger
has_many :products
def tags
self.owned_tags
end
def taggings
self.owned_taggings
end
end
编辑 2:
这就是我的Vendor 表的架构:
create_table "vendors", :force => true do |t|
t.string "name"
t.text "description", :limit => 255
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.string "banner_image"
t.string "logo_image"
t.string "intro_text"
end
【问题讨论】:
-
我的猜测是错误来自模型。可以发一下吗?
-
@m_x 完成。查看更新的问题。
-
这很奇怪,我必须承认我不知道它来自哪里。我想您应该检查carrierwave的来源-
thumb_image_changed?是一种通常由ActiveModel::Dirty创建的魔术方法,我不知道为什么在这种情况下它不会自动创建。愚蠢的问题:您的迁移都是最新的吗? -
@m_x 是的。问题是,在我的所有表格中都没有
thumb_image列。这是我在上面显示的image_uploader.rb文件中指定的载波设置。我已更新问题以包含我的vendors文件的架构。 -
也许你需要这个栏目,另外两张图有自己的。事实上,我认为这就是问题所在:对于另外两个 ActiveRecord 自动创建属性访问器(并处理脏状态),对于这个你没有访问器,甚至没有虚拟属性访问器。如果我没记错的话,carrierwave 会安装在现有的访问器上......
标签: ruby-on-rails ruby-on-rails-3 carrierwave fog