我是rails的新手,所以我决定开始按照一本书开始练习练习,但是对于rails 3来说,所以没有一些东西不适用于rails 4.我试图根据代码构建简单的图像上传器从书中(无需告诉我其他方式可以轻松实现) 所以我有一个观点:
<%= form_for(@person, :html => { :multipart => true }) do |f| %>
<% if @person.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@person.errors.count, "error") %> prohibited this person from being saved:</h2>
<ul>
<% @person.errors.full_messages.each do |msg| %>
<li><% xxx=msg.split %>
<% xxx.shift %>
<%= p xxx.join(" ")%>
</li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :secret %><br>
<%= f.password_field :secret %>
</div>
<div class="field">
<p>
<%= f.label :country %><br />
<%= f.select :country, [ ['Canada', 'Canada'],['Mexico', 'Mexico'],['United Kingdom', 'UK'],['United States of America', 'USA'] ]%>
</p>
</div>
<div class="field">
<%= f.label :email %><br>
<%= f.text_field :email %>
</div>
<div class="field">
<%= f.label :description %><br>
<%= f.text_area :description %>
</div>
<div class="field">
<%= f.label :can_send_email %><br>
<%= f.check_box :can_send_email %>
</div>
<div class="field">
<%= f.label :graduation_year %><br>
<%= f.number_field :graduation_year %>
</div>
<div class="field">
<%= f.label :body_temperature %><br>
<%= f.text_field :body_temperature %>
</div>
<div class="field">
<%= f.label :price %><br>
<%= f.text_field :price %>
</div>
<div class="field">
<%= f.label :birthday %><br>
<%= f.date_select :birthday %>
</div>
<div class="field">
<%= f.label :favourite_time %><br>
<%= f.time_select :favourite_time %>
</div>
<div class="field">
<%= f.label :photo %><br />
<%= f.file_field :photo %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
创建控制器的一部分:
def create
@person = Person.new(person_params)
respond_to do |format|
if @person.save
format.html { redirect_to @person, notice: 'Person was successfully created.' }
format.json { render action: 'show', status: :created, location: @person }
else
format.html { render action: 'new' }
format.json { render json: @person.errors, status: :unprocessable_entity }
end
end
end
def person_params
params.require(:person).permit(:name, :secret, :country, :email, :description, :can_send_email, :graduation_year, :body_temperature, :price, :birthday, :favourite_time)
end
模特的一部分:
after_save :store_photo
private
PHOTO_STORE = File.join Rails.root, 'public', 'photo_store'
def store_photo
if @file_data
FileUtils.mkdir_p PHOTO_STORE
File.open(photo_filename, 'wb') do |f|
f.write(@file_data.read)
end
@file_data = nil
end
end
def photo=(file_data)
unless file_data.blank?
@file_data = file_data
self.extension = file_data.original_filename.split('.').last.downcase
end
end
def photo_filename
File.join PHOTO_STORE, "#{id}.#{extension}"
end
def photo_path
"/photo_store/#{id}.#{extension}"
end
end
但它不起作用,我知道我可能需要将“照片”添加到允许的参数中但是当我这样做时会给我一个错误,因为我的数据库中没有这样的属性,我只有“扩展名”对于上传图像的扩展名,因为文件名将是= ID,如“24.jpg”。我想我需要允许“照片”参数并且仍然可以创建一个新人(比如添加“照片”作为例外或者其他东西,但我不知道如何做到这一点,如果是这样的话)。无论如何,有人可以帮助我吗?
答案 0 :(得分:2)
我认为你应该添加&#34;照片&#34;允许的参数,或者它不会被放入模型中。
然后移动&#34;照片=&#34;以上&#34;私人&#34;,因为如果&#34; photo =&#34;是一种私有方法,Rails将无法找到属性&#34;照片&#34;
def photo=(file_data)
unless file_data.blank?
@file_data = file_data
self.extension = file_data.original_filename.split('.').last.downcase
end
end
private
........