#database #ruby-on-rails-3 #file-upload
#База данных #ruby-on-rails-3 #загрузка файла
Вопрос:
Я новичок в 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 отдельных строк из-за «параметров [:mail][logo].original_filename»…
Итак, я хотел бы спросить вас, существует ли какой-либо лучший способ, как решить эту ситуацию…
Комментарии:
1. Если вы напишете »
@mail = Mail.find(params[:id]).save
«, то вашаsave
Метод не возвращает сохраненный объект. Осторожно!
Ответ №1:
Существует стандартный способ присвоения атрибутов моделям:
@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) amp;amp; f.respond_to?(:original_filename)
f.rewind
self[:logo_content] = f.read
self[:logo_filename] = f.original_filename
end