【问题标题】:rails - collecting data (no Active Record) from form submittedrails - 从提交的表单中收集数据(无 Active Record)
【发布时间】:2015-07-07 07:11:33
【问题描述】:

编辑:改写我的问题:

我有一个@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

非常感谢各位!我需要了解它是如何工作的!

编辑

我在Send parameter to before_save读到

简短的回答:回调永远不会有参数。假设回调对对象或记录本身采取行动。因此,您需要作为参数的任何内容都需要存储为属性(保存到数据库中)或实例变量。 @nathanvda

正如@Mattherick 所说:

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

如何解决这个问题?

【问题讨论】:

  • 您到底想实现什么? :-) 我真的不明白你的问题,对不起。但到目前为止我可以看到的是你在你的模型中使用 params[:i] 做了一些事情..这不起作用..参数在控制器中可用,但在模型中不可用。您可以将它们传递给模型中的方法,但 params[:i] 在模型中不起作用..
  • @Mattherick 我需要键“Lorem ipsum”、“aliquip ex ea”、“cillum dolore”和“est labourum”的值,这些对没有活动记录数据,我需要它执行 before_save 类。
  • 你为什么使用before_save?正如您所说,您不是在处理 AR 对象。难道你不能简单地使用一个从你的控制器接受参数的方法来做你的事情并将修改后的文本返回给控制器吗?
  • @MurifoX 好吧,我不知道是怎么做到的……有什么线索吗?

标签: ruby-on-rails arrays forms params before-save


【解决方案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

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

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

【讨论】:

  • 感谢您的回复。不要结果,我得到 NoMethodError in CommentsController#create undefined method [] for nil:NilClass Extracted source (around line #21): #21 body = body.gsub(/@@#{i}@@/, hash[i]) 。并且容器不会更改表单提交参数:(
  • 这个想法是创建模板,其形式更改可变文本,由'@@'包围
  • 你能发布你的新参​​数哈希吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2023-03-04
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多