0

編集:私の質問を言い換えてください:

@template_written生成する があり@final_written.bodyます。したがって、 を作成するため@final_writtenに、@final_written.bodyは prefilled( 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 パラメータを before_saveに読み込みます

簡単に言えば、コールバックにはパラメーターがありません。コールバックは、オブジェクトまたはレコード自体に対してアクションを実行すると想定されています。したがって、パラメーターとして必要なものはすべて、属性 (データベースに保存されます) またはインスタンス変数として保存する必要があります。@nathanvda

@マザリックが言うように:

パラメーターはコントローラーで使用できますが、モデルでは使用できません。モデルのメソッドにそれらを渡すことはできますが、params[:i] はモデルでは機能しません..

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

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

コメント.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

これがあなたが望む結果であるかどうかは本当にわかりません..そして私は自分のコードをテストしませんでした..しかし、おそらくこのアプローチはあなたを助けることができます..

于 2015-07-07T20:43:23.290 に答える