我希望用戶能夠選擇他們說的語言。我已經建立了關聯,表格屬性和表格的一部分。當我選擇一種語言,提交表單我去鐵軌控制檯,做一個u.languages
,但我得到一個空數組回:=> []
將Has_many關聯映射到不同的模型
這裏有日誌,當我提交表單:
Started POST "/update_user_via_user" for 127.0.0.1 at 2016-03-18 13:26:03 +0200
ActiveRecord::SchemaMigration Load (0.4ms) SELECT "schema_migrations".* FROM "schema_migrations"
Processing by UsersController#update_user_via_user as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"CB1Qca0VrBcap9qO6VpKfoi2dG8GNG+tGGNDgCnFEv4E=", "user"=>{ "fullname"=>"John Doe", "languages"=>["", "1", "2"]}, "commit"=>"Save"}
User Load (28.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = 3 ORDER BY "users"."id" ASC LIMIT 1
Unpermitted parameters: languages
(0.1ms) begin transaction
(0.1ms) commit transaction
Redirected to http://127.0.0.1:3000/setup_profile
Completed 302 Found in 163ms (ActiveRecord: 29.5ms)
現在如果仔細觀察這些人,你會看到「未經許可的參數:語言」。
在我users_controller我有以下內容:
def user_params
params.require(:user).permit(:languages, :fullname)
end
和自定義操作:
def update_user_via_user
if current_user.update(user_params)
flash.notice = "Your profile was sent for moderation. We will moderate it asap!"
else
flash.alert = "Something went wrong! Please try again."
end
redirect_to root_path
end
其他一些參考:(我在最後的問題)
schema.rb:
語言表:
create_table "languages", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "user_id"
end
用戶表:
t.string "languages"
language.rb模型:
class Language < ActiveRecord::Base
belongs_to :user
end
和user.rb模型:
class User < ActiveRecord::Base
has_many :languages
end
的視圖:
<%= f.label :languages %>
<%= f.select :languages, Language.all.map{ |l| [l.name, "#{l.id}"] }, {}, { :multiple => true } %>
我不知道爲什麼「語言」是不允許的,也如果我的代碼的概念是正確的
試試這個:'params.require(:user).permit(:fullname,languages:[])' – Deep
我不確定你正在使用的概念。 'language'屬於'user',你允許用戶選擇語言意味着你需要創建新的語言記錄,而不是讓他們選擇你的情況。否則你需要一個模型來存儲它,比如'user_languages'。它應該在'has_many through'的'HABTM'上,並且爲了避免重複使用你應該保留模型的語言。 – Deep
@Deep嘗試了第一個。它給了我一個語法錯誤 –