私の悪い英語でごめんなさい。非常に奇妙なバグがあります。 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 インスタンスのすべての属性を自分で設定しました。保存内容も正しい。