编辑:改述我的问题:
我有一个@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')。
我在表单中添加了这个(在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
?
非常感谢!我需要了解它是如何工作的!
修改
我在Send parameter to before_save
中读到答案简短:回调永远不会有参数。假设回调对对象或记录本身采取行动。因此,您需要将任何需要存储的参数作为属性(保存到数据库中)或作为实例变量存储。 @nathanvda
正如@Mattherick所说:
params在控制器中可用,但在模型中不可用。您 可以将它们传递给模型中的方法,但是params [:i]不会 在模型中工作..
如何解决此问题?
答案 0 :(得分:0)
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
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
我真的不知道这是否是你想要的结果..而且我没有测试我的代码..但也许这种方法可以帮助你..