Ruby on rails rails-从提交的表单收集数据(无活动记录)

Ruby on rails rails-从提交的表单收集数据(无活动记录),ruby-on-rails,arrays,forms,params,before-save,Ruby On Rails,Arrays,Forms,Params,Before Save,编辑:重新表述我的问题: 我有一个@template\u writed,从中生成@final\u writed.body。因此,要创建@final\u writed,需要预先填充@final\u writed.body(final\u writed属于template\u writed) 从@final\u writed.body生成数组@names(attr\u accessor:names),其中的文本用@@包围 @names = ["Lorem ipsum", "aliquip ex ea

编辑:重新表述我的问题:

我有一个
@template\u writed
,从中生成
@final\u writed.body
。因此,要创建
@final\u writed
,需要预先填充
@final\u writed.body
final\u writed属于template\u writed

@final\u writed.body
生成数组
@names(attr\u accessor:names)
,其中的文本用@@包围

@names = ["Lorem ipsum", "aliquip ex ea", "cillum dolore", "est laborum"]
我的目标是将
@final_writed.body
中的数组引用替换为表单(在视图“new”中)

我在表单中添加了以下内容(在new.html.erb中):

我尝试过(和其他成千上万的东西),但不起作用(comment.rb):

如何从提交的数据中收集我需要的数据?和 保存前如何使用它修改
@final\u writed.body

谢谢大家!我需要了解它是如何工作的

编辑

我读报

简单的回答是:回调从来没有参数。假定回调对对象或记录本身进行操作。因此,任何需要作为参数的内容都需要存储为属性(保存到数据库中)或实例变量@纳桑夫达

正如@Mattherick所说:

参数在控制器中可用,但在模型中不可用。你 可以将它们传递给模型中的方法,但params[:i]不会 在模型中工作

如何解决这个问题?

1)我不太明白你的逻辑,也不明白你为什么要这么做,但不管怎样,也许我可以帮你…-)

2) 您应该更改表单,在“动态”生成的表单字段周围有一个“容器”-参数

<%= @name.each do |k| %> 
  <%= label_tag k %> <br>
  <%= text_field_tag "your_container[#{k}]" %> <br/>
<% end %>
3) 将控制器操作更改为以下内容:

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"
}
注释_controller.rb(Rails 4.2):

comment.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

我真的不知道这是否是你想要的结果。。我没有测试我的代码..但也许这种方法可以帮助你..

你到底想实现什么?:-)对不起,我真的不明白你的问题。但到目前为止,我看到的是,您在模型中使用params[:I]做了一些事情..这将不起作用。。参数在控制器中可用,但在模型中不可用。您可以将它们传递给模型中的一个方法,但params[:i]在模型中不起作用。@Mattherick我需要键“Lorem ipsum”、“aliquip ex ea”、“cillum dolore”和“est labourum”的值,这些对不是活动记录数据,我需要它来执行before_save类。为什么要在before_save之前使用
?正如您所说,您不是在处理
AR
对象。你不能简单地使用一种方法,从你的控制器接受参数,然后把修改过的文本返回给控制器吗?@MurifoX嗯,我不知道怎么做。。。有什么线索吗?谢谢你的回复。不产生结果,我在CommentsController中为nil:NilClass提取的源代码(在第21行附近)创建未定义的方法[]得到
NoMethodError:#21 body=body.gsub(/@@@{I}@@/,hash[I])
。上下文不改变表单提交参数:(想法是创建模板,模板的表单会改变变量文本,它被“@@”包围,你能发布你的新参数散列吗?
<%= @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"
}
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
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