Ruby on rails Rails 5简单表单保存模型属性中表单提交的哈希值
在我的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
培训
。在此表单中,我已经为每个参与者设置了复选框,以便将他们分配到培训中。现在,我尝试为每个参与者添加一个单选按钮组(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