Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 5简单表单保存模型属性中表单提交的哈希值_Ruby On Rails_Forms_Simple Form - Fatal编程技术网

Ruby on rails Rails 5简单表单保存模型属性中表单提交的哈希值

Ruby on rails Rails 5简单表单保存模型属性中表单提交的哈希值,ruby-on-rails,forms,simple-form,Ruby On Rails,Forms,Simple Form,在我的Rails 5应用程序中,我有一个简单的表单,用于创建或更新我的模型培训。在此表单中,我已经为每个参与者设置了复选框,以便将他们分配到培训中。现在,我尝试为每个参与者添加一个单选按钮组(5,评分范围从1到5),因为每个人都可以对培训进行评分 我成功地渲染了我想要的单选按钮,但不幸的是,我只能选择渲染的所有单选按钮中的一个。它们甚至奇怪地连接到复选框,这可能是因为它们具有相同的输入方法参与者ID,该输入方法连接到has\u和\u属于与参与者关联的许多参与者:参与者 <%= simpl

在我的Rails 5应用程序中,我有一个简单的表单,用于创建或更新我的模型
培训
。在此表单中,我已经为每个
参与者设置了复选框,以便将他们分配到
培训中。现在,我尝试为每个
参与者添加一个单选按钮组(5,评分范围从1到5),因为每个人都可以对
培训进行评分

我成功地渲染了我想要的单选按钮,但不幸的是,我只能选择渲染的所有单选按钮中的一个。它们甚至奇怪地连接到复选框,这可能是因为它们具有相同的输入方法
参与者ID
,该输入方法连接到
has\u和\u属于与
参与者关联的许多
参与者
:参与者

<%= simple_form_for @training do |f| %>
...
  <div id="participants-ratings-container">
    <div id="participants-container" style="display: inline-block; vertical-align: top; width: 8em">
    <%= f.label t('activerecord.models.participant') %>
    <%= f.collection_check_boxes :participant_ids, Participant.all.order(:name), :id, :name, {:item_wrapper_class => 'checkbox-container'}  %>
  </div>

  <div id="ratings-container" style="display: inline-block; vertical-align: top">
    <%= f.label t('trainings._form.ratings') %>
    <% Participant.all.order(:name).each do |p| %>
    <%= f.input :participant_ids, collection: 1..5, as: :radio_buttons, label: false%>
    <% end %>
  </div>
...
<% end %>
如果未选中相应的参与者复选框,则每个评级都将被禁用,其值将设置为0。以下是我的查看代码:

<div id="ratings-container" style="display: inline-block; vertical-align: top">
    <%= f.label t('trainings._form.ratings') %>
    <% Participant.all.order(:name).each do |p| %>
      <span class="checkbox_container">
        <% current_rating = @training.participant_ratings[p.id].nil? ? '' : @training.participant_ratings[p.id] %>
           <label id='star<%= "#{p.id}" %>' data-rating='<%= "#{current_rating}" %>' style="margin-bottom: 12px;" ></label>
        <input id="rating<%= "#{p.id}" %>" name="participant_ratings[<%= "#{p.id}" %>]" type="hidden" value="<%= "#{@training.participant_ratings[p.id]}" %>" />
      </span>
        <script>
            $('#star<%= "#{p.id}" %>').raty({
                score: function() {
                    return $(this).attr('data-rating');
                },
                half  : true,
                readOnly: <%= !@training.participants.include?(p) %>,
                path: '/assets',
                click : function(score, evt) {
                    $('#rating<%= "#{p.id}" %>').val(score);
                }
            });
            $('#training_participant_ids_<%= "#{p.id}" %>').change(function () {
                var star = $('#star<%= "#{p.id}" %>');
                if(document.getElementById('training_participant_ids_<%= "#{p.id}" %>').checked) {
                    star.raty('readOnly', false);
                } else {
                    star.raty('cancel');
                    star.raty('readOnly', true);
                    $('#rating<%= "#{p.id}" %>').val("");
                }
            })
        </script>
    <% end %>
</div>    
现在我得到了错误

Attribute was supposed to be a Hash, but was a ActionController::Parameters. -- <ActionController::Parameters {"3"=>"5", "1"=>"3.5", "2"=>""} permitted: false>
如何将表单发送的哈希保存在模型属性中?哪里出错了?

我是否可以在参数中定义
参与者评分
作为散列,类似于数组
参与者ID
中的散列?

首先,我必须确保参与者评分散列在我的表单提交时的培训散列中,因此我必须更改隐藏表单输入中的name属性以进行评分:

<input id="rating<%= "#{p.id}" %>" name="training[participant_ratings][<%= "#{p.id}" %>]" type="hidden" value="<%= "#{@training.participant_ratings[p.id]}" %>" />
我发现这个解决方案


在那之后,参与者的评分被保存得很好

首先,当我的表单提交时,我必须确保参与者\u rating-hash在培训hash中,因此我必须更改隐藏表单输入中的name属性,以便进行评分:

<input id="rating<%= "#{p.id}" %>" name="training[participant_ratings][<%= "#{p.id}" %>]" type="hidden" value="<%= "#{@training.participant_ratings[p.id]}" %>" />
我发现这个解决方案

在那之后,参与者的评分被保存得很好

class TrainingsController < BaseController
...
  def update
    @training = Training.find(params[:id])
    @training.updated_date_time = DateTime.now
    @training.participant_ratings = params[:participant_ratings]

    if @training.update(training_params)
      flash[:notice] = t('flash.training.updated')
      redirect_to @training
    else
      render 'edit'
    end
  end

  private
    def training_params
      params.require(:training).permit(:village, :topic, :user_id, :start_time, :end_time, {:participant_ids => []}, :participant_ratings)
    end
end
<input id="rating<%= "#{p.id}" %>" name="training[participant_ratings][<%= "#{p.id}" %>]" type="hidden" value="<%= "#{@training.participant_ratings[p.id]}" %>" />
def training_params
  ratings_keys = params[:training].try(:fetch, :participant_ratings, {}).keys
  params.require(:training).permit(:village, :topic, :user_id, :start_time, :end_time, {:participant_ids => []}, participant_ratings: ratings_keys )
end