我有一个表格,巫婆用户可以添加他们的工作时间查看和编辑它们(全部在一页)。添加工作时间时,用户必须从下拉列表中选择项目。如果操作正在添加新的小时记录,则下拉字段应保持为空(未选中)以防操作被编辑,应使用适当的值选择下拉字段。 为了克服这个挑战,我写了以下代码
<% if params[:id].blank?%>
<select name="hour[project_id]" id="hour_project_id">
<option value="nil">Select Project</option>
<% @projects.each do|project|%>
<option value="<%=project.id %>"><%=project.name%></option>
<% end%>
</select>
<% else %>
<%= select('hour','project_id', @projects.collect{|project|[project.name,project.id]},{:prompt => 'Select Project'})%>
<% end %>
因此,在保存操作的情况下,我只使用html执行下拉列表,并且在编辑操作的情况下,我使用了collect方法。它工作正常,直到我尝试编码错误。问题是,当我使用错误方法时:validates_presence_of:project_id它不会在下拉列表的html表单中识别它,也不会显示错误消息(它仅适用于使用collect方法的下拉列表)。 / p>
我将非常感谢您在此事上的指示和帮助
答案 0 :(得分:1)
options_from_collection_for_select(collection,value_method,text_method,selected = nil)是你的朋友:
<%= select('hour','project_id', options_from_collection_for_select(@projects, :id, :name, @hour.project_id),{:prompt => 'Select Project'})%>
如果有一个@hour对象并且它是新的且因此没有project_id,则该值将为nil并且不会选择任何内容 - 或者将选择@hour的值。