0

私の悪い英語でごめんなさい。非常に奇妙なバグがあります。 utf8 コンテンツを含むタスクモデルのインスタンスを作成すると、データベースに格納されたコンテンツが入力されたものとは異なります。contentフィールドは ckeditor を使用して作成されます。ここにあります:

  • ユーザー入力:Lưu
  • パラメータ:{"task"=> {"name"=>"Store", "description"=>"Store", "price"=>"10000", "content"=>"<p>\r\n\tLưu</p>\r\n"}, "commit"=>"Create Task", "action"=>"create", "controller"=>"tasks"}
  • メモリ内のインスタンス:#<Task id: nil, name: "Store", description: "Store", price: 10000, created_at: nil, updated_at: nil, content: "<p>\r\n\tLưu</p>\r\n">
  • 保存されるもの:#<Task id: 10, name: "Store", description: "Store", price: 10000, created_at: "2012-05-22 03:47:11", updated_at: "2012-05-22 03:47:11", content: "\\x3c703e0d0a094cc6b0753c2f703e0d0a">

ただし、最も奇妙な部分は、そのモデルを編集して保存すると、コンテンツが入力されたとおりに保存されることです。

コンテンツ列の移行は次のとおりです。

class AddContentToTasks < ActiveRecord::Migration
  def change                   
    add_column :tasks, :content, :text
  end
end

これが私のコントローラーです:

  def update
    @task.update_attributes!(params[:task])
  end

  def create                   
    binding.pry                
    @task = Task.new(params[:task])   
    @task.user = current_user  
    @task.save                 
    redirect_to tasks_path
  end

(binding.pry を使用して) デバッグすると、@task.content が正しいことがわかります。ただし、@task.save の後、最後に作成された Task のコンテンツ (Task.last) はそうではありません。

更新 1: 私の database.yml

development:                   
  adapter: postgresql          
  encoding: utf8
  reconnect: false             
  database: crowd              
  pool: 5
  username: username          
  password: password           
  host: localhost

test: &test
  adapter: postgresql
  encoding: utf8
  reconnect: false
  database: crowd-test
  pool: 5
  username: username          
  password: password           
  host: localhost

私の schema.rb コンテンツ。

# encoding: UTF-8

ActiveRecord::Schema.define(:version => 20120519133158) do

     create_table "tasks", :force => true do |t|
        t.string   "name"
        t.string   "description"
        t.integer  "price"
        t.datetime "created_at",   :null => false
        t.datetime "updated_at",   :null => false
        t.integer  "user_id"
        t.integer  "task_type_id"
        t.text     "content"
        t.date     "expired_at"
      end
end

postgre からの私のスキーマ情報

                                   List of databases
    Name    |   Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
------------+-----------+----------+-------------+-------------+-----------------------
 crowd      | username  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 crowd-test | username  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 

更新 2: を使用する代わりに@task = Task.new(params[:task])、 @task インスタンスのすべての属性を自分で設定しました。保存内容も正しい。

4

0 に答える 0