Rails 3 - сохранение данных с использованием CONTROLLER.new (params [: controller]) - PullRequest
0 голосов
/ 09 июня 2011

Я новичок в 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" ...

Так что я хотел бы спросить вас, если есть какой-нибудь лучший способ, как решить эту ситуацию ...

1 Ответ

1 голос
/ 09 июня 2011

Существует стандартный способ присвоения атрибутов моделям:

@mail = Mail.find(params[:id])
@mail.attributes = params[:mail]
if @mail.save
  #...and so on.

Вы можете определить все необходимые средства доступа, которые не обязательно должны совпадать со столбцами в базе данных, и вы можете захотетьчтобы прочитать о acceptpts_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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...