【发布时间】:2014-03-30 16:17:20
【问题描述】:
然后我想使用 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'
listings_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)
【问题讨论】:
-
您是否在
listing_params中包含 :avatar 作为允许的参数? -
这确实应该是他的问题。在 def listing_params 中,您至少应该有以下内容: params.require(:listing).permit(:avatar, :avatar_file_name)
-
@rails4guides.com,实际上你不应该在参数中需要
:avatar_file_name,只要:avatar就足够了,因为Paperclip 自己处理它自己的属性。或者换一种说法,我不需要在我的应用中指定它。 -
你应该这么想。但是,我确实记得曾经看过一个 github 问题,它实际上似乎是必要的。
-
@JJThaeler 我想你忘了在
listings表中创建avatar的对应字段。
标签: ruby-on-rails ruby image ruby-on-rails-4 paperclip