【问题标题】:When updating a _form partial that has an image, but not the image, I get an error更新具有图像但没有图像的 _form 部分时,出现错误
【发布时间】: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


【解决方案1】:

事实证明,我必须在我的 Vendor 模型上删除调用 mount_uploader :thumb_image,因为我在该模型上没有名为 thumb_image 的列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 2012-09-02
    • 2019-12-20
    • 2023-02-06
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    相关资源
    最近更新 更多