2017-05-31 25 views
0
5個強PARAMS

我的形式:Rails的數組

.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 

當我HIST 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 

回答

0

的問題是,你需要手動列入白名單,所有這些參數,像這樣:

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

但我猜你不希望出現這種情況,那麼你可以使用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 
+0

如果我刪除了ID,表單中的電臺將無法正常工作,因爲它們都具有相同的名稱。 我試圖讓參數看起來像 '「question」=>「4e9a4356-2c18-4310-9502-6f287a3d47d7」=> {「answer」=>「1」,「question_id」=>「4e9a4356 -2c18-4310-9502-6f287a3d47d7「,」user_id「=>」397b17a9-005d-4b65-ba81-668582acb12b「},' 所以我的白名單會是'params.require(:my_quiz).permit(:question = > [:question_id,:user_id,:answer])' – Marrento

+0

@Marrento您建議的方式無法完成,您只能指定一個'key =>值',您無法執行'key => value => value'。也許這是使用'permit!'的好時機,否則你可能會在發送表單之前使用一些javascript/jquery來操作DOM。 – Gerry

+0

謝謝。在意識到發生了什麼之前,我已經打了很多次了。我有我的初始發佈結束時的解決方案,我只需要讓它變得漂亮:) – Marrento