Saya memiliki aplikasi Rails 3 yang berfungsi yang menggunakan has_many: melalui asosiasi yang tidak, karena saya membuat kembali sebagai aplikasi Rails 4, memungkinkan saya menyimpan id dari model terkait dalam versi Rails 4.
Ini adalah tiga model yang relevan sama untuk kedua versi.
Kategorisasi.rb
class Categorization < ActiveRecord::Base
belongs_to :question
belongs_to :category
end
Pertanyaan.rb
has_many :categorizations
has_many :categories, through: :categorizations
Category.rb
has_many :categorizations
has_many :questions, through: :categorizations
Di kedua aplikasi, id kategori diteruskan ke tindakan pembuatan seperti ini
"question"=>{"question_content"=>"How do you spell car?", "question_details"=>"blah ", "category_ids"=>["", "2"],
Di aplikasi Rails 3, ketika saya membuat pertanyaan baru, itu memasukkan tabel pertanyaan dan kemudian ke tabel kategorisasi
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]]
Di app rails 4, setelah memproses parameter di QuestionController # create, saya mendapatkan error ini di log server
Unpermitted parameters: category_ids
dan pertanyaan hanya dimasukkan ke dalam tabel pertanyaan
(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
Meskipun saya tidak menyimpan category_ids pada model Pertanyaan, saya menetapkan category_ids sebagai parameter yang diizinkan dalam question_controller
def question_params
params.require(:question).permit(:question_details, :question_content, :user_id, :accepted_answer_id, :province_id, :city, :category_ids)
end
Adakah yang bisa menjelaskan bagaimana saya seharusnya menyimpan category_ids? Catatan, tidak ada tindakan buat di category_controller.rb dari salah satu aplikasi.
Ini adalah tiga tabel yang sama di kedua aplikasi
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
Memperbarui
Ini adalah aksi buat dari aplikasi 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
Ini adalah aksi buat dari aplikasi 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
Ini adalah metode 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