在我的Rails 5應用程序中,我有一個簡單的表單用於爲我的模型Training
創建或更新。在這個表格中,我已經有了我的每個Participant
的複選框,以將它們分配給Training
。現在我試圖爲每個Participant
添加一個單選按鈕組(5對於1到5的評分),因爲每個按鈕組可以評分Training
。Rails 5簡單表單保存模型屬性中的表單提交的哈希值
Screen shot of the rendered form
我設法使單選按鈕,因爲我想只可惜我只能選擇呈現的所有單選按鈕之一。他們甚至連接奇怪的複選框,這可能是因爲他們有相同的輸入法participant_ids
,它連接到has_and_belongs_to_many
協會與Participant
:participants
。
<%= 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 %>
我嘗試了很多東西,但我沒有想法了。如果可能,我想以「參與者名稱」=>評分值的方式在我的Training
課程中填寫哈希participant_ratings
。
任何人都可以給我一個關於如何實現這一點的提示嗎?如果相應的Participant
未被選中,甚至可能告訴我如何禁用單選按鈕組?
在此先感謝!
UPDATE
我設法去適應我的形式,甚至整合的jQuery插件RATY進入每個Participant
評定值。每個評級與其相應的參與者ID一起作爲散列發送到服務器,例如,如下所示:
"participant_ratings"=>{"3"=>"5", "1"=>"3.5", "2"=>""}.
如果未選中相應的參與者複選框,則將禁用每個評分並將其值設置爲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: <%= [email protected]?(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>
New screen shot of the rendered form
我似乎不過去的事情才能夠搞清楚的是如何保存participant_ratings散列相應的模型屬性:participant_ratings
如果我允許參數:participant_ratings
在我的trainings_controller.rb
中,但沒有保存。所以我添加
@training.participant_ratings = params[:participant_ratings]
,現在我得到的錯誤
Attribute was supposed to be a Hash, but was a ActionController::Parameters. -- <ActionController::Parameters {"3"=>"5", "1"=>"3.5", "2"=>""} permitted: false>
我trainings_controller.rb
方法:
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
如何保存由形式模型的發送哈希屬性?我哪裏錯了?
我可以以某種方式將participant_ratings
定義爲類似於數組participant_ids
的參數中的散列嗎?