rails - сбор данных (без Active Record) из отправленной формы

РЕДАКТИРОВАТЬ: перефразируйте мой вопрос:

У меня есть @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] не будет работать в модели.

Как решить эту проблему?


person mguz    schedule 07.07.2015    source источник
comment
Что именно вы хотите реализовать? :-) Я не очень понимаю ваш вопрос, извините. Но пока я вижу, что вы что-то делаете с params[:i] в своей модели... это не сработает... параметры доступны в контроллере, но не в модели. вы можете передать их методу в своей модели, но params[:i] не будет работать в модели.   -  person Matthias    schedule 07.07.2015
comment
@Mattherick Мне нужно значение ключей Lorem ipsum, aliquip ex ea, cillum dolore и est Laborum, эти пары не являются активными данными записи, и мне это нужно для выполнения класса before_save.   -  person mguz    schedule 07.07.2015
comment
Почему вы используете before_save? Как вы сказали, вы не имеете дело с объектами AR. Разве вы не можете просто использовать метод, который принимает параметры от вашего контроллера, и возвращает измененный текст контроллеру?   -  person MurifoX    schedule 07.07.2015
comment
@MurifoX Ну, я не знаю, как это сделать ... есть подсказки?   -  person mguz    schedule 08.07.2015


Ответы (1)


1) Я не очень понимаю вашу логику, и почему вы должны это делать, но в любом случае, может быть, я мог бы вам помочь.. :-)

2) Вы должны изменить свою форму, чтобы у вас были "контейнерные" параметры вокруг ваших "на лету" сгенерированных полей формы.

<%= @name.each do |k| %> 
  <%= label_tag k %> <br>
  <%= text_field_tag "your_container[#{k}]" %> <br/>
<% end %>

Это изменит ваш параметр на следующий:

Parameters: 
  {
  "utf8"=>"✓", 
  "authenticity_token"=>"iw3ZCksupersecretU4sVyi5D",
  "comment"=>{
    "commenter"=>"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@@."
   }, 

"your_container"=>{
  "Lorem ipsum"=>"bla",
  "aliquip ex ea"=>"bla",
  "cillum dolore"=>"bla",
  "est laborum"=>"bla"
},

 "commit"=>"Create Comment", 
 "post_id"=>"1"
}

3) Измените действие вашего контроллера на что-то вроде следующего:

comment_controller.rb (Rails 4.2):

def create
  @comment = Comment.new(comment_params)
  if @comment.save
   redirect_to your_path
  else
   render :new
  end
end

private

  def comment_params
    params[:comment][:body] = Comment.extract_body(params[:comment][:body], params[:your_container])
    params.require(:comment).permit(:commenter, :body, :post_id)
  end

комментарий.rb

def self.extract_body(body, hash)
  kwords = body.scan(/@@(.+?)@@/).flatten
  kwords = kwords.uniq

  kwords.each do |i|
    body = body.gsub(/@@#{i}@@/, hash[i])
  end

  body
end

Я действительно не знаю, тот ли это результат, который вы хотите получить... и я не тестировал свой код... но, возможно, этот подход может вам помочь...

person Matthias    schedule 07.07.2015
comment
Спасибо за ответ. Не результат, я получаю NoMethodError in CommentsController#create undefined method [] for nil:NilClass Extracted source (around line #21): #21 body = body.gsub(/@@#{i}@@/, hash[i]) . И контейнер не меняет параметры отправки формы :( - person mguz; 08.07.2015
comment
идея состоит в том, чтобы создавать шаблоны, формы которых изменяют переменный текст, окруженный '@@' - person mguz; 08.07.2015
comment
Можете ли вы опубликовать свой новый хэш параметров, пожалуйста? - person Matthias; 08.07.2015