簡體   English   中英

使用數組定義強參數

[英]Using an array to define strong params

我有一個正在創建的表格,其中包含大量問題。 而不是用html硬編碼所有這些代碼。

我打算將它們存儲在稱為questions的表中,並通過一個腳本在整個表中循環來填充調查表視圖,該腳本將問題的文本從一列中拉出,並將其對應的參數從另一列中拉出。

答案將存儲在Questionnaire模型和表格中。 除了處理強大的參數時,這似乎相對簡單。

所以我有模型Question和表questions 其中包含列the_questionsthe_parameters

中包含的該表的問題對應的模型字段Questionnaire 我想查詢數據庫以獲取參數數組,然后將其放入調查表控制器中的強參數中。

因此,而不是:

def questionnaire_params
  params.require(:questionnaire).permit(:an, :enormous, :list, :of, :params.....)
end

我想做類似的事情:

def questionnaire_params
  @my_params=Questions.the_parameters
  params.require(:questionnaire).permit(@my_params)
end

有什么辦法嗎? 我是否會在這個想法中向左走? 任何指導或告誡將不勝感激。

我想查詢數據庫以獲取參數數組,然后將其放入調查表控制器中的強參數中。

這意味着,您將允許批量分配所有和每個屬性。

為此,您只需要使用permit! 方法,該方法會將每個模型的屬性列入白名單:

params.require(:questionnaire).permit! # I don't want to even start discussing downsides of whitelisting all attributes

如果您有一些屬性,但您不想允許進行批量分配而仍然想使用數組,則可以定義

def questionnaire_params
  @all_attributes = Model.column_names.map(&:to_sym)
  @not_permitted = [:id, :some_other_attribute]
  params.require(:questionnaire).permit(@all_attributes - @not_permitted)
end

您可能需要重新考慮如何對應用程序建模。 通常,當您需要操縱強大的參數時,這表示代碼有異味。

問題和答案與問卷之間有什么關系? 作為替代方案,請考慮以下建模:

  • 問卷具有多個答案和多個問題
  • 答案屬於一個問題,屬於一個問卷
  • 一個問題has_many答案

您可以通過答案來解決問題。 您的問卷調查的強項將是

params.require(:questionnaire).permit(
  answers_attributes: [:id, :question_id, :text]
)

我嘗試了類似的東西(雖然不確定我是否正確回答了您的問題)

params.require(:parent).permit(ModelName.column_names)

但是,然后您就無法達到強大參數的目的。

嘗試

params.require(:parent).permit(Parent.column_names - blacklist_array )

params.require(:parent).permit(Parent.column_names - [:tax_num , :age])
params.require(:questionnaire).permit(Questionaire.column_names.map(&:to_sym))

檢查是否適合您。

ActionController::Parameters采用數組:

$ bin/rails c
> params = ActionController::Parameters.new(user: {name: 'John', age: 22})
=> {"user"=>{"name"=>"John", "age"=>22}} 
> permitted = params.require(:user).permit(:name, :age)
=> {"name"=>"John", "age"=>22} 
> permitted = params.require(:user).permit([:name, :age])
=> {"name"=>"John", "age"=>22} 
> permitted = params.require(:user).permit(*[:name, :age])
=> {"name"=>"John", "age"=>22} 
> permitted = params.require(:user).permit('name', 'age')
=> {"name"=>"John", "age"=>22}

因此,你可以通過你的@my_params作為數組permit

您不需要龐大的不同參數列表即可完成像問卷這樣的簡單操作。 你只是做錯了。 而且您不想在數據庫中填充參數白名單。 當涉及到軟件版本控制時,它會很慢並且會引起一些真正的頭痛。

問卷的相當標准的設計應該是這樣的:

<%= form_for(:questions, controller: 'questions', action: 'create') do |form| %>
    <% @questions.each do |question| %> 
        <fieldset>
        <%= fields_for(question) do |qf| %>
          <legend><%= question.title %></legend>
          <%= qf.collection_check_boxes :answer_ids, question.answers, :id, :text %>
        <% end %>
        </fieldset>
    <% end %>
<% end %> 

參數:

params.require(:questions).allow(question: [:answer_ids])

暫無
暫無

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

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