hidden要素の内容をPOSTすると、改行が半角スペースになってしまうときの対処

Tsukasa OISHI

確認画面などを経由して投稿するシステムを作るとき、たいていはデータをhidden要素に入れてPOSTすると思います。このとき、value値の中の改行が半角スペースに変換されてしまうことがあります(特に携帯とか)。
いろいろ対処方法はあると思うのだけど、僕は単純に改行コード自体を特殊な記号に変換しておいて、POSTの受付側でそれをデコードするという方法をよく使います。

とあるviewで、

<% @article.body = return_code(@article.body) %>
<%= hidden_field :article, :body %>

みたいにしておいて、POSTの受け側のアクションで

params[:article][:body] = return_code(params[:article][:body], :decode)

というように、処理の前にデコードしておきます。
return_codeメソッドは

  def return_code(text, mode = :encode)
    if mode == :encode
      text.gsub("\r\n", "[kaeru:ret-rn]").gsub("\r", "[kaeru:ret-r]").gsub("\n", "[kaeru:ret-n]")
    elsif mode == :decode
      text.gsub("[kaeru:ret-rn]", "\r\n").gsub("[kaeru:ret-r]", "\r").gsub("[kaeru:ret-n]", "\n")
    else
      text
    end
  end

こんな感じ。app/controller/application.rbで定義しておいて、

helper_method :return_code

と宣言しておけばcontrollerでもviewでもどこでも使えます。