#ruby-on-rails-3 #forms #params
#ruby-on-rails-3 #формы #параметры
Вопрос:
Итак, я создаю программу, в которой есть скрипт «Набор шагов для выполнения задачи», который может быть применим ко всем хранилищам или только к нескольким избранным. Параметр all stores — это логическое значение, которое сохраняется вместе со сценарием. Что я хотел бы сделать, так это когда вы выбираете «Да» для всех хранилищ, это должно удалить все хранилища, связанные с этим скриптом, если таковые имеются. Таблицы script и store имеют связь HABTM. Вопрос в том, как мне проверить внутри параметра, является ли значение all_stores true? Я попробовал несколько вещей, и, похоже, просто игнорируется оператор if для сравнения параметра all stores с true
Контроллер скрипта
def update
params[:script][:store_ids] ||= []
if params[:script][:all_stores] == true
params[:script][:store_ids] = []
end
@script = Script.find(params[:id])
if @script.update_attributes(params[:script])
flash[:notice] = 'Script was successfully updated'
redirect_to :action => 'index'
else
@categories = category_search
render :action => 'edit'
end
end
Просмотр редактирования скрипта
<%= form_for(:script, :url => {:action => 'update', :id =>@script.id}) do |f| %>
<div id="script_form_visibility">
<div class="issue_section_header" align="center">Visibility</div>
<div class="line-break"></div>
<div class="standardText"><span class="boldText">All Stores:</span> <%=f.radio_button(:all_stores, true)%> Yes <%=f.radio_button(:all_stores, false)%> No</div>
<br/>
<div class="issue_section_header" align="center">Stores</div>
<div class="line-break"></div>
<div class="standardText">
<%@stores.each do |store|%>
<%= check_box_tag 'script[store_ids][]', store.id, @script.store_ids.include?(store.id), :id => dom_id(store) %>
<%= label_tag dom_id(store), store.name, :class => "check_box_label" %><br/>
<%end%>
</div>
</div>
<div id="script_form">
<div class="boldText"><%= f.label :name %></div>
<div><%=f.text_field :name, :size => '94', :maxlength => '70'%></div>
<div>
<table width="100%" cellspacing="0">
<tr>
<td class="boldText"><%= f.label :category_id, "Category" %></td>
<td class="boldText" align="right">Show ID Required Field</td>
</tr>
<tr>
<td class="standardText"><%=f.select(:category_id, @categories.collect {|c| [c.name, c.id]}, :selected => session[:admin_category])%></td>
<td class="standardText" align="right"><%=f.radio_button(:require_id, true)%> Yes <%=f.radio_button(:require_id, false)%> No</td>
</tr>
</table>
</div>
<div class="boldText"><%= f.label :task %></div>
<div><%= f.text_area(:task, :size => "68x20") %></div>
<div class="boldText"><%= f.label :expected_results, "Expected Results" %></div>
<div><%= f.text_area(:expected_results, :size => "68x20") %></div>
<div align="center"><%= f.submit "Update Script" %></div>
</div>
<% end %>
Ответ №1:
Подобные проблемы легко решаются в rails debugger. Запустите его, а затем установите точку останова в этой строке:
if params[:script][:all_stores] == true
Когда вы достигнете точки останова, например, содержимое вашего хэша параметров
(rdb:3) p params[:script][:all_stores]
Это объяснит вам, почему ваш код ведет себя не так, как ожидалось.
Комментарии:
1. Спасибо, это должно было быть, если params[:script] [:all_stores] == «true»