使用数组来定义强对数

时间:2015-05-28 08:53:27

标签: ruby-on-rails arrays ruby-on-rails-4 strong-parameters

我有一张表格,我正在使用一系列极好的问题创建。而不是硬编码所有这些在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

有没有办法做到这一点?我是否想出这个想法?任何指导或警告将不胜感激。

6 个答案:

答案 0 :(得分:3)

  

我想查询数据库以获取参数数组   然后将它们放入调查问卷中的强力参数中   控制器。

这意味着,您将允许所有和每个属性被分配。

为此,您只需使用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

答案 1 :(得分:2)

您可能想重新考虑如何为应用程序建模。通常当你需要操纵强烈的params时,它表示代码气味。

问题和答案以及问卷如何相关?作为替代方案,请考虑这种建模:

  • 调查问卷has_many答案和has_many问题通过答案
  • 答案属于问题,属于问卷
  • 一个问题has_many answers

您可以通过答案回答问题。您的调查问卷的强大参数将是

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

答案 2 :(得分:1)

我尝试了类似的东西(不确定我的问题是否正确)

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])

答案 3 :(得分:1)

params.require(:questionnaire).permit(Questionaire.column_names.map(&:to_sym))

检查这是否适合您。

答案 4 :(得分:0)

.采用数组:

.

因此,您只需将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}

答案 5 :(得分:0)

您不需要大量不同的参数来做一些简单的调查问卷。你做错了。而且你不想在数据库中填写一个参数白名单。在软件版本控制方面,它会很慢并引起一些真正的麻烦。

调查问卷的一个相当标准的设计是这样的:

<%= 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])