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
sumber
Jawaban:
Https://github.com/rails/strong_parameters ini sepertinya bagian yang relevan dari dokumen:
Di aplikasi saya, category_ids diteruskan ke tindakan buat dalam array
Oleh karena itu, ketika mendeklarasikan parameter kuat, saya secara eksplisit mengatur category_ids menjadi array
Bekerja dengan baik sekarang!
( PENTING: Seperti yang dicatat @Lenart di komentar, deklarasi array harus di akhir daftar atribut, jika tidak Anda akan mendapatkan kesalahan sintaks.)
sumber
syntax error, unexpected ')', expecting =>
category_ids
bukan array (mis. string dikirim) maka rail benar-benar menjadi gila dan menimbulkan aERROR TypeError: expected Array (got String) for param `category_ids'
Apakah itu bug di rails? Sunting: ya itu adalah: github.com/rails/rails/issues/11502params.permit(:foo, { bar: [] }, :zoo)
.Jika Anda ingin mengizinkan array hash (atau
an array of objects
dari perspektif JSON)2 poin untuk diperhatikan di sini:
array
harus menjadi argumen terakhir daripermit
metode ini.Unpermitted parameter: array
, yang sangat sulit untuk di-debug dalam kasus ini.sumber
array
tidak harus pada akhirnya, tetapi Anda harus memastikan bahwa Anda memiliki Ruby yang valid.params.permit(:foo, array: [:key1, :key2], :bar)
tidak akan menjadi ruby yang valid karena juru bahasa mengharapkan kunci hash: pasangan nilai setelah set pertama. Untuk memiliki Ruby yang valid, Anda perluparams.permit(:foo, {array: [:key1, :key2]}, :bar)
Itu harus seperti
Juga karena rails versi 4+ Anda dapat menggunakan:
sumber
Jika Anda memiliki struktur hash seperti ini:
Maka beginilah cara saya membuatnya bekerja:
sumber
Saya belum bisa berkomentar tetapi mengikuti solusi Fellow Stranger Anda juga dapat tetap bersarang jika Anda memiliki kunci yang nilainya array. Seperti ini:
Ini bekerja:
sumber