我是Rails的新手,现在我正在解决这个问题,如何最有效地将数据保存到数据库中。我的表单包含10个输入(=表中的10列),第11个输入用于文件。
如果我要使用
@mail = Mail.find(params[:id]).save
所以我会把这样的东西放在我的桌子上(专栏):
--- !ruby/object:ActionDispatch::Http::UploadedFile
content_type: image/jpeg
headers: |
Content-Disposition: form-data; name="mail[logo]"; filename="panama-city-15.jpg"
Content-Type: image/jpeg
original_filename: panama-city-15.jpg
tempfile: !ruby
但我只需要存储文件名-"panama-city-15.jpg"
@mail = Mail.new(:mail_id => @mail_source.id.to_i,
:a => params[:mail][:a],
:b => params[:mail][:b],
...
:logo => params[:mail][logo].original_filename)
但我认为有点没有必要键入10行单行,因为"params[:mail][logo].original_filename"…
所以我想问你,如果有更好的方法,如何解决这种情况。。。
有一种为模型分配属性的标准方法:
@mail = Mail.find(params[:id])
@mail.attributes = params[:mail]
if @mail.save
#...and so on.
您可以定义所有必要的访问器,这些访问器不需要与数据库中的列相同,并且您可能希望了解accepts_nested_attributes_for方法。
因此,如果你想存储上传文件的原始文件名,你可以这样做:
# Beware: this is only an example of technical possibility.
# Do not handle uploaded files in this way!
#
def logo=(f)
self[:logo] = f.original_filename
end
但我认为这是个坏主意。如果只存储原始文件名,则文件将丢失。它将在您处理请求后立即从服务器中删除。你必须把文件保存在某个地方。
# This may work for you.
#
def logo=(f)
return unless f.respond_to?(:read) && f.respond_to?(:original_filename)
f.rewind
self[:logo_content] = f.read
self[:logo_filename] = f.original_filename
end