

以下のモデルを例にします。

## Post

  * id
  * name
  * body

これにデータを追加するときは`Post.save(params)`とすればイケルと思いますが、  
`Post.body`に独自の加工をほどこしたいのですがどうしたらよいのでしょうか。

モデルに`before_save`を使って書くと思うのですが、パラメータを加工して保存する場合、実際にはどのようなコードになるのでしょうか。


CC BY-SA 3.0
2015-04-19T13:10:05.343
9317
2015-04-20T00:45:07.837
5855
question
ruby-on-rails
railsで保存前に加工したい


単純な加工の場合は、アクセサをオーバーライドします。

[code]

    class Post < ActiveRecord::Base
      def body=(param)
        data = do_something(param)
        write_attribute(:body, data)
      end
    end
    
    #do_somethingの中身が * 2 だったとすると
    Post.new(body: "hoge") #=> #<Post id: nil, body: "hogehoge", ...>
    
[/code]

参考 [Overwriting default
accessors](http://api.rubyonrails.org/classes/ActiveRecord/Base.html)

他のカラムのデータに依存して編集したい場合、そのカラムの内容がアクセサが呼ばれた段階で反映されているかわからないので、うまくいきません。その場合はやはりコールバックを使うことになります。

[code]

    class Post < ActiveRecord::Base
      before_save :update_body
    
      def update_title
        data = do_something(read_attribute(:body), read_attribute(:title))
        write_attribute(:body, data)
      end
    end
    
[/code]

ただし、コールバックは呼ばれない場合があったり、`before_save`だとsaveの度に呼ばれたりするので、注意が必要です。

コントローラで加工する方法もありますが、コントローラにロジックを書くのは好ましくないので、どうしてもコントローラでやらなければならない理由があるときだけにした方がよいでしょう。

[code]

    class PostsController < ApplicationController
      def create
        attr = post_params
        attr[:body] = do_something(attr[:body])
        @post = Post.new(attr)
        post.save
      end
    end
    
[/code]


CC BY-SA 3.0
2015-04-20T00:45:07.837
9324
2015-04-20T00:45:07.837
5793
9317
answer