У меня есть форма, в которой значения для сериализованного поля выбираются серией раскрывающихся списков.Я боролся с этим довольно много часов, пытаясь заставить его работать хорошо.Есть несколько проблем.
TypeError (expected Hash (got String) for param 'rankings'
после отправки. - Как лучше всего отправить эту форму на
create
, если запись новая, или update
если он существует?(Показана текущая реализация).
Компания указывает несколько критериев, таких как «общая» или «стоимость» или «производительность».Каждый из этих критериев имеет раскрывающийся список в этой форме.Пользователь выбирает свой рейтинг для каждого из критериев, и результаты сохраняются в @ review.rankings ( serialized ).
# controller
@review = Review.find_or_initialize_by_user_id(current_user.id)
@rankings = @review.rankings # if @review exists, these contain this user's current choices
@criteria = @company.criteria # each has its own dropdown
# show.html.erb
<% @review.id.blank? ? (action = "create") : (action = "update") %>
<%= form_for @review, :as => :review, :url => params.merge(:controller => "reviews", :action => action, :id => @review.try(:id)) do |f| %>
<%= f.error_messages %>
<% @criteria.each do |label| %>
<%= f.fields_for :rankings do |f| %>
<%= f.text_field label, :value => @review.rankings.present? ? (@rankings[label]) : nil %>
<%= label %>:
<select id="review_rankings_<%= label %>" name="review[rankings][<%= label %>]">
<option value="0" <%= @rankings.present? && @rankings[label] == "0" ? "selected='selected'" : nil %>>Very poor</option>
<option value="1" <%= @rankings.present? && @rankings[label] == "1" ? "selected='selected'" : nil %>>Poor</option>
<option value="2" <%= @rankings.blank? || @rankings[label] == "2" ? "selected='selected'" : nil %>>Average</option>
<option value="3" <%= @rankings.present? && @rankings[label] == "3" ? "selected='selected'" : nil %>>Good</option>
<option value="4" <%= @rankings.present? && @rankings[label] == "4" ? "selected='selected'" : nil %>>Very Good</option>
<option value="5" <%= @rankings.present? && @rankings[label] == "5" ? "selected='selected'" : nil %>>Exceptional</option>
</select>
<% end %>
<% end %>
<%= submit_tag "Update", :class=>"greenButton" %>
<% end %>
Источник HTML
<form accept-charset="UTF-8" action="/reviews/21?ci=21&jd=37&rank=1&count=1&key=104fdf0f23712e69e0e7acd507ea4eeb&mkey=e6ec509f1f13ed00f9e0b07b2daeced6" class="review_edit" id="review_edit" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="_method" type="hidden" value="put" /><input name="authenticity_token" type="hidden" value="S89rpLRSqye18RAD3cjdAD83Vvn0oFubooMhA7AX7Ms=" /></div>
performance:
<select id="review_rankings_performance" name="review[rankings][performance]">
<option value="0" >Very poor</option>
<option value="1" >Poor</option>
<option value="2" >Average</option>
<option value="3" >Good</option>
<option value="4" >Very Good</option>
<option value="5" >Exceptional</option>
</select>
<input class="greenButton" name="commit" type="submit" value="Update" />
</form>