Rails 2.3.11
我想在一个条件下使用text_field输入数据,否则使用选择框。现在,我的代码看起来像这样:
视图/海报/ new.html.erb
<% form_for @poster, :html => {:multipart => true} do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :image %> - We're not going to enlarge it for you, so please upload the biggest copy you can!<br />
<%= f.file_field :image %><br />
</p>
<p>
<% if current_user.admin? && params[:event_id] && !current_user.events.find_by_id(params[:event_id]) && Event.find_by_id(params[:event_id]) %>
<%= f.label "Event ID" %><br />
<%= f.text_field :event_id, :value => params[:event_id] %>
<% else %>
<%= f.label :event_id %><br />
<%= f.select :event_id, @events, :selected => params[:event_id].to_i %>
<% end %>
</p>
<p>
<%= f.submit 'Create' %>
</p>
<% end %>
控制器/ posters_controller.rb
def new
@poster = Poster.new
current_user ||= User.find_by_id session[:user_id]
@events = [["Don't attach to an event", '']]
current_user.events.each {|event| @events << [event.title, event.id]}
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @poster }
end
end
错误消息:http://cl1p.net/halp
如何为同一参数使用两种不同类型的表单输入字段(但每种情况都在不同条件下,而不是同时使用)?
更新:我认为问题源于Rails将之前提交的信息放回各自输入字段的问题。这解释了为什么当一个文件通过所有验证测试(即PNG小于3 MB)时不会抛出发脾气,但是当没有附加任何东西(或任何不符合该条件的东西)时会发生故障。
答案 0 :(得分:1)
首先,我不明白为什么要在文本框中手动设置值并选择框。通常,Rails会为您执行此操作,但如果没有表单定义,我无法确定您是否真的需要这样做。
即便如此,鉴于这些信息,我认为可以说你需要的是这个:
f.text_field :event_id
...
f.select :event_id, @events
这应该适用于你打算做的事情。我不确定它与提交文件有什么关系,但是对于之前提交的部分你是对的。意想不到的结果源于此:
params[:event_id].to_i
除非您在控制器内手动设置此参数条目,否则如果它是nil,则无法将其转换为整数。如果你使用基本的表单助手调用就会消失。