Rails 3 — сохранение данных с использованием CONTROLLER.new(параметры [: controller])

#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 «, то ваша @mail переменная будет иметь значение true или false. 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