回形针错误:模型缺少attr_accessor所需的' avatar_file_name'

时间:2014-03-30 16:17:21

标签: ruby-on-rails ruby image ruby-on-rails-4 paperclip

然后,我想使用Paperclip为每个列表提供照片。我将相应的代码添加到列表show.html.erb,listing.rb模型,listings_controller.rb和_form.html.erb部分。

当我尝试为列表上传图片时,我收到此错误:

Paperclip::Error in ListingsController#update
Listing model missing required attr_accessor for 'avatar_file_name'

listing_controller的第44行:

def update
 respond_to do |format|
  if @listing.update(listing_params)
    format.html { redirect_to @listing, notice: 'Listing was successfully updated.' }
    format.json { head :no_content }
  else

要尝试的一些事情:即向listing.rb模型添加一些代码,以使:avatar的可接受图像更加健壮。以下是几个stackoverflow帖子中提到的添加到listing.rb模型的内容:

validates_attachment_content_type :avatar, :content_type => %w(image/jpeg image/jpg image/png) 

不幸的是,当我附加图像时,我仍然会遇到相同的错误。当我没有附加图像时,我的默认图像被正确加载并正确创建列表。

我的清单模型:

class Listing < ActiveRecord::Base
  has_attached_file :avatar, :styles => { :medium => "150x", :thumb => "100x100>" },   :default_url => "default.jpg"
  validates_attachment_content_type :avatar, :content_type => %w(image/jpeg image/jpg image/png) 
end

我的_form.html.erb部分:

<%= form_for @listing, :html => { :multipart => true } do |f| %>
  <% if @listing.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@listing.errors.count, "error") %> prohibited this listing from being saved:</h2>

      <ul>
      <% @listing.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="form-group">
    <%= f.label :name %><br>
    <%= f.text_field :name, class: "form-control" %>
  </div>
  <div class="form-group">
    <%= f.label :company %><br>
    <%= f.text_field :company, class: "form-control" %>
  </div>
  <div class="form-group">
    <%= f.label :email %><br>
    <%= f.text_field :email, class: "form-control" %>
  </div>
  <div class="form-group">
    <%= f.label :phone %><br>
    <%= f.text_field :phone, class: "form-control" %>
  </div>
  <div class="form-group">
    <%= f.label :avatar %><br>
    <%= f.file_field :avatar, class: "form-control" %>
  </div>
  <div class="form-group">
    <%= f.submit class: "btn btn-primary" %>
  </div>
<% end %>

我的listings_controller.rb控制器:

 def update
    respond_to do |format|
      if @listing.update(listing_params)
        format.html { redirect_to @listing, notice: 'Listing was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @listing.errors, status: :unprocessable_entity }
      end
    end
  end
...
def listing_params
   params.require(:listing).permit(:name, :company, :email, :phone, :avatar)
end

我的schema.rb文件

ActiveRecord::Schema.define(version: 20140329174335) do

  create_table "listings", force: true do |t|
    t.string   "name"
    t.string   "company"
    t.string   "email"
    t.string   "phone"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

end

编辑:运行$ rails后添加控制台输出生成回形针列表头像

(我需要10个声望点才能发布帖子,所以你必须满足于链接http://i.imgur.com/c8KGTa3.png

3 个答案:

答案 0 :(得分:24)

我想你忘了在avatar表格中为listings创建相应的字段。

我建议您生成迁移,将avatar添加到listings表格,如下所示:

rails generate paperclip listing avatar

然后运行rake db:migrate

更新

根据您的评论和编辑,您有一个迁移文件,可以将avatar添加到您通过运行listings创建的rails generate paperclip user avatar表,但不幸的是由于某种原因它不会通过ie,根据{{​​1}},avatar specific fields("avatar_file_name", "avatar_content_type", "avatar_file_size" and "avatar_updated_at")表格中没有listings。这是一种非常奇怪的行为。

我建议您按顺序执行以下步骤:

销毁现有迁移(如果有):

db/schema.rb

生成新迁移:

rails destroy paperclip listing avatar  

生成

rails generate paperclip listing avatar

更新2

我希望你没有拒绝投票给我(但有人这样做了),所以我想提醒一下,这是Paperclip的一个持续性问题,我确实在我的评论中提出了一个解决方案(3月31日),如下所示:

  

我希望你尝试作为gem&#39; paperclip&#39;,:git =&gt;   &#34; GIT中://github.com/thoughtbot/paperclip.git"在Gemfile中然后捆绑   安装。完成后告诉我

显然,你或今天投票给我的人没有注意到。 另外,您说rake db:migrate i.imgur.com/c8KGTa3.png但是如果您查看输出,则会出现错误说明:

  

migration_file_name&#39 ;: protected methodmigration_file_name&#39;呼吁   PaperclipGenerator:0x007fb3c6494c20(NoMethodError)

答案 1 :(得分:4)

从错误消息中,file_name在您尝试保存的模型中不可用。我有类似的问题,并意识到我忘了运行Paperclip迁移:

rails generate paperclip [Model Name] [Attachment](例如rails g paperclip Images image

如果这不起作用,因为它所拥有的问题是列“file_name”,请尝试将其添加到模型中(例如rails g migration addFilenameToImages file_name:string

这对我有用,所以希望它对你们有些帮助!

答案 2 :(得分:1)

确保在paperclip_database:migration中使用复数表示新表名,并在paperclip生成器中使用单数形式:

rails g paperclip_database:migration cms_article_category cms_article_category_images
rails g paperclip cms_article_category cms_article_category_image

并检查数据库中的结果列名称  在您的示例中,头像表中的列应称为avatar_file_name