РЕДАКТИРОВАТЬ: перефразируйте мой вопрос:
У меня есть @template_written
, из которого я генерирую @final_written.body
. Поэтому для создания @final_written
предварительно заполняется @final_written.body
(final_written belongs_to template_written
).
Из @final_written.body
генерируется массив @names (attr_accessor :names)
с текстами, окруженными @@.
@names = ["Lorem ipsum", "aliquip ex ea", "cillum dolore", "est laborum"]
Моя цель - заменить вхождения массива в @final_written.body
формой (в представлении «новое»).
Я добавил это в форму (в new.html.erb):
<%= @names.each do |k| %>
<%= label_tag k %> <br>
<%= text_field_tag k %> <br>
<% end %>
которые отправляют это:
Parameters:
{
"utf8"=>"✓",
"authenticity_token"=>"iw3ZCksupersecretU4sVyi5D",
"final_written"=>{
"title"=>"Ted",
"body"=>"@@Lorem ipsum@@ dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut @@aliquip ex ea@@ commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse @@cillum dolore@@ eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id @@est laborum@@."
},
"Lorem ipsum"=>"bla",
"aliquip ex ea"=>"bla",
"cillum dolore"=>"bla",
"est laborum"=>"bla",
"commit"=>"Create final_written",
"template_written_id"=>"1"
}
Я пробовал (и тысячи других вещей), но не работает (comment.rb):
before_save :change
protected
def change
kwords = self.body.scan(/@@(.+?)@@/).flatten
kwords = kwords.uniq
cuerpo = self.body
kwords.each do |i|
i = params[:i]
cuerpo.gsub(/@@#{i}@@/, i)
end
self.body = cuerpo
end
Как собрать данные, которые мне нужны, из отправленных данных? и как использовать его для изменения @final_written.body
перед сохранением?
Большое спасибо, ребята! Мне нужно понять, как это работает!
ИЗМЕНИТЬ
Я прочитал в Отправить параметр в before_save
Краткий ответ: обратные вызовы никогда не имеют параметров. Предполагается, что обратные вызовы воздействуют на объект или на саму запись. Таким образом, все, что вам понадобится в качестве параметра, вам нужно будет сохранить либо как атрибут (который сохраняется в базе данных), либо как переменную экземпляра. @nathanvda
Как говорит @Mattherick:
параметры доступны в контроллере, но не в модели. вы можете передать их методу в своей модели, но params[:i] не будет работать в модели.
Как решить эту проблему?
before_save
? Как вы сказали, вы не имеете дело с объектамиAR
. Разве вы не можете просто использовать метод, который принимает параметры от вашего контроллера, и возвращает измененный текст контроллеру? - person MurifoX   schedule 07.07.2015