Tôi có một ứng dụng Rails 3 hoạt động sử dụng has_many: thông qua các liên kết không có, khi tôi làm lại nó dưới dạng ứng dụng Rails 4, cho phép tôi lưu id từ mô hình được liên kết trong phiên bản Rails 4.
Đây là ba mô hình có liên quan giống nhau cho hai phiên bản.
Phân loại.rb
class Categorization < ActiveRecord::Base
belongs_to :question
belongs_to :category
end
Câu hỏi
has_many :categorizations
has_many :categories, through: :categorizations
Chuyên mục.rb
has_many :categorizations
has_many :questions, through: :categorizations
Trong cả hai ứng dụng, id danh mục đang được chuyển vào hành động tạo như thế này
"question"=>{"question_content"=>"How do you spell car?", "question_details"=>"blah ", "category_ids"=>["", "2"],
Trong ứng dụng Rails 3, khi tôi tạo một câu hỏi mới, nó sẽ chèn vào bảng câu hỏi và sau đó vào bảng phân loại
SQL (82.1ms) INSERT INTO "questions" ("accepted_answer_id", "city", "created_at", "details", "province", "province_id", "question", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) [["accepted_answer_id", nil], ["city", "dd"], ["created_at", Tue, 14 May 2013 17:10:25 UTC +00:00], ["details", "greyound?"], ["province", nil], ["province_id", 2], ["question", "Whos' the biggest dog in the world"], ["updated_at", Tue, 14 May 2013 17:10:25 UTC +00:00], ["user_id", 53]]
SQL (0.4ms) INSERT INTO "categorizations" ("category_id", "created_at", "question_id", "updated_at") VALUES (?, ?, ?, ?) [["category_id", 2], ["created_at", Tue, 14 May 2013 17:10:25 UTC +00:00], ["question_id", 66], ["updated_at", Tue, 14 May 2013 17:10:25 UTC +00:00]]
Trong ứng dụng rails 4, sau khi nó xử lý các tham số trong Câu hỏi # tạo, tôi gặp lỗi này trong nhật ký máy chủ
Unpermitted parameters: category_ids
và câu hỏi chỉ được đưa vào bảng câu hỏi
(0.2ms) BEGIN
SQL (67.6ms) INSERT INTO "questions" ("city", "created_at", "province_id", "question_content", "question_details", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id" [["city", "dd"], ["created_at", Tue, 14 May 2013 17:17:53 UTC +00:00], ["province_id", 3], ["question_content", "How's your car?"], ["question_details", "is it runnign"], ["updated_at", Tue, 14 May 2013 17:17:53 UTC +00:00], ["user_id", 12]]
(31.9ms) COMMIT
Mặc dù tôi không lưu trữ category_ids trên mô hình Câu hỏi, tôi đặt category_ids làm tham số được phép trong câu hỏi_controll
def question_params
params.require(:question).permit(:question_details, :question_content, :user_id, :accepted_answer_id, :province_id, :city, :category_ids)
end
Bất cứ ai cũng có thể giải thích làm thế nào tôi có thể lưu danh mục_ids? Lưu ý, không có hành động tạo nào trong chuyên mục_controll.rb của một trong hai ứng dụng.
Đây là ba bảng giống nhau trong cả hai ứng dụng
create_table "questions", force: true do |t|
t.text "question_details"
t.string "question_content"
t.integer "user_id"
t.integer "accepted_answer_id"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "province_id"
t.string "city"
end
create_table "categories", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "categorizations", force: true do |t|
t.integer "category_id"
t.integer "question_id"
t.datetime "created_at"
t.datetime "updated_at"
end
Cập nhật
Đây là hành động tạo từ ứng dụng Rails 3
def create
@question = Question.new(params[:question])
respond_to do |format|
if @question.save
format.html { redirect_to @question, notice: 'Question was successfully created.' }
format.json { render json: @question, status: :created, location: @question }
else
format.html { render action: "new" }
format.json { render json: @question.errors, status: :unprocessable_entity }
end
end
end
Đây là hành động tạo từ ứng dụng Rails 4
def create
@question = Question.new(question_params)
respond_to do |format|
if @question.save
format.html { redirect_to @question, notice: 'Question was successfully created.' }
format.json { render json: @question, status: :created, location: @question }
else
format.html { render action: "new" }
format.json { render json: @question.errors, status: :unprocessable_entity }
end
end
end
Đây là phương thức question_params
private
def question_params
params.require(:question).permit(:question_details, :question_content, :user_id, :accepted_answer_id, :province_id, :city, :category_ids)
end