簡體   English   中英

Rails 5數組的強大參數

[英]Rails 5 Strong Params for array

我的表格:

.row
  .col-lg-6
    = form_tag my_quizzes_path do
      - @questions.each do |question|
        = fields_for @my_quiz do |p|
          .field
            %p= question.title
            = p.label :answer
            = radio_button_tag "my_quiz[#{question.id}][answer]", '0'
            = radio_button_tag "my_quiz[#{question.id}][answer]", '1'
            = hidden_field_tag "my_quiz[#{question.id}][question_id]", question.id
            = hidden_field_tag "my_quiz[#{question.id}][user_id]", current_user.id

      .actions
      = submit_tag

生成此:

{"utf8"=>"✓",
 "authenticity_token"=>"gJYhNisJDuLkfgm3rmy5VBJZ2koMVH0SUJPK+3Z3avZ2cju6GTmS2etr62dx+xFoWrKnrsrKt/lZg9F2o5sIsA==",
 "my_quiz"=>
  {"4e9a4356-2c18-4310-9502-6f287a3d47d7"=>{"answer"=>"1", "question_id"=>"4e9a4356-2c18-4310-9502-6f287a3d47d7", "user_id"=>"397b17a9-005d-4b65-ba81-668582acb12b"},
   "32722fb7-3ad4-4614-9e8b-0ea6ee5e3838"=>{"answer"=>"1", "question_id"=>"32722fb7-3ad4-4614-9e8b-0ea6ee5e3838", "user_id"=>"397b17a9-005d-4b65-ba81-668582acb12b"},
   "e38b673d-789a-4025-859c-f8a6e6dd80b0"=>{"answer"=>"1", "question_id"=>"e38b673d-789a-4025-859c-f8a6e6dd80b0", "user_id"=>"397b17a9-005d-4b65-ba81-668582acb12b"},
   "267f7fab-3a8a-4e3e-8642-a1035c7aa850"=>{"answer"=>"1", "question_id"=>"267f7fab-3a8a-4e3e-8642-a1035c7aa850", "user_id"=>"397b17a9-005d-4b65-ba81-668582acb12b"},
   "fd320da5-44d8-4328-a1b1-0ccc2115b49d"=>{"answer"=>"0", "question_id"=>"fd320da5-44d8-4328-a1b1-0ccc2115b49d", "user_id"=>"397b17a9-005d-4b65-ba81-668582acb12b"},
   "eab94286-cfeb-40ae-be5f-3d54538d6b0c"=>{"answer"=>"0", "question_id"=>"eab94286-cfeb-40ae-be5f-3d54538d6b0c", "user_id"=>"397b17a9-005d-4b65-ba81-668582acb12b"},
   "8b85ff1e-ccdc-4ca5-b289-19505551e305"=>{"answer"=>"0", "question_id"=>"8b85ff1e-ccdc-4ca5-b289-19505551e305", "user_id"=>"397b17a9-005d-4b65-ba81-668582acb12b"},
   "b00aa7a6-1072-4fcd-9faa-fcca16046dcb"=>{"answer"=>"0", "question_id"=>"b00aa7a6-1072-4fcd-9faa-fcca16046dcb", "user_id"=>"397b17a9-005d-4b65-ba81-668582acb12b"},
   "fc329254-4dba-4a61-ac71-3e148bb8a7fc"=>{"answer"=>"0", "question_id"=>"fc329254-4dba-4a61-ac71-3e148bb8a7fc", "user_id"=>"397b17a9-005d-4b65-ba81-668582acb12b"},
   "60791317-ae09-4d28-9569-8b95f7bd8c87"=>{"answer"=>"0", "question_id"=>"60791317-ae09-4d28-9569-8b95f7bd8c87", "user_id"=>"397b17a9-005d-4b65-ba81-668582acb12b"}},
 "commit"=>"Submit"}

這是我的創建和白名單方法

def create
  params["my_quiz"].each do |question_id, data|
    @my_quiz = MyQuiz.new(my_quiz_params)
    @my_quiz.save
  end

  redirect_to user_path(@user), notice: "Thank you taking the quiz!"
end

...

def my_quiz_params
  params.require(:my_quiz).permit(my_quiz: [:question_id, :user_id, :answer])
end

當我Save我得到了id的不允許的參數

 Unpermitted parameters: 
 :4e9a4356-2c18-4310-9502-6f287a3d47d7, 
 :32722fb7-3ad4-4614-9e8b-0ea6ee5e3838, 
 :e38b673d-789a-4025-859c-f8a6e6dd80b0, 
 :267f7fab-3a8a-4e3e-8642-a1035c7aa850, 
 :fd320da5-44d8-4328-a1b1-0ccc2115b49d, 
 :eab94286-cfeb-40ae-be5f-3d54538d6b0c, 
 :8b85ff1e-ccdc-4ca5-b289-19505551e305, 
 :b00aa7a6-1072-4fcd-9faa-fcca16046dcb, 
 :fc329254-4dba-4a61-ac71-3e148bb8a7fc, 
 :60791317-ae09-4d28-9569-8b95f7bd8c87

我覺得問題出在哈希本身。 我可以嘗試以下類似create方法的方法,但是感覺不像Rails的方法。

def create
  return params[:my_quiz].each do |k, v|
    puts "Values of V"
    puts v.permit(:question_id, :user_id, :answer).inspect
    q = MyQuiz.new(v.permit(:question_id, :user_id, :answer))
    q.save!
    q
  end
  redirect #somewhere
end

問題是您需要手動將所有這些參數列入白名單,如下所示:

def my_quiz_params
  params.require(:my_quiz).permit(
    "4e9a4356-2c18-4310-9502-6f287a3d47d7": [:question_id, :user_id, :answer],
    "32722fb7-3ad4-4614-9e8b-0ea6ee5e3838": [:question_id, :user_id, :answer]
    #...
  )
end

請注意,由於您已經在require添加了:my_quiz ,因此也無需添加它來permit :my_quiz

但是我想你不想要那個,所以你可以使用permit! 代替:

def my_quiz_params
  params.require(:my_quiz).permit!
end

注意permit! 將允許任何參數通過my_quiz組。


另一種選擇(如果您希望的行為允許)是從表格中刪除question.id

.row
  .col-lg-6
    = form_tag my_quizzes_path do
      - @questions.each do |question|
        = fields_for @my_quiz do |p|
          .field
            %p= question.title
            = p.label :answer
            = radio_button_tag "my_quiz[][answer]", '0'
            = radio_button_tag "my_quiz[][answer]", '1'
            = hidden_field_tag "my_quiz[][question_id]", question.id
            = hidden_field_tag "my_quiz[][user_id]", current_user.id

      .actions
      = submit_tag

因此,您將收到沒有該ID的參數(您已經在:question_id發送了它):

{
  "utf8"=>"✓",
  "authenticity_token"=>"gJYhNisJDuLkfgm3rmy5VBJZ2koMVH0SUJPK+3Z3avZ2cju6GTmS2etr62dx+xFoWrKnrsrKt/lZg9F2o5sIsA==",
  "my_quiz"=>[
    {"answer"=>"1", "question_id"=>"4e9a4356-2c18-4310-9502-6f287a3d47d7", "user_id"=>"397b17a9-005d-4b65-ba81-668582acb12b"},
    {"answer"=>"1", "question_id"=>"32722fb7-3ad4-4614-9e8b-0ea6ee5e3838", "user_id"=>"397b17a9-005d-4b65-ba81-668582acb12b"},
    {"answer"=>"1", "question_id"=>"e38b673d-789a-4025-859c-f8a6e6dd80b0", "user_id"=>"397b17a9-005d-4b65-ba81-668582acb12b"},
    ...
    ]
  "commit"=>"Submit"
}

您的白名單方法將變為:

def my_quiz_params
  params.require(:my_quiz).permit([:question_id, :user_id, :answer])
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM