我有这种稍微偏左的情况,我无法开始工作。最简单的问题是我使用 has_one/belongs_to 关联构建了这个选择,它填充得很好,在提交时返回有效值,但是如果提交由于某种原因失败(例如,不同的输入验证失败),当表单是使用错误消息重新绘制,选择默认为列表中的第一个值,而不是选择的值...这里有一些上下文。
我有以下两个模型。第一个是我从 PHP 应用程序继承的表,并且必须“玩得很好”,因此它不遵循 rails 约定:
class Listing < ActiveRecord::Base
set_primary_key :lid
has_one :site
end
class Site < ActiveRecord::Base
belongs_to :listing
end
你可以看到我不得不跳过一个小圈子来掩盖这个遗留表使用“lid”而不是“id”作为其主键的事实。
在我看来,我使用 ActionView::Helpers::FormBuilder::select 选择了这个表单:
.field
.left.form-label
= f.label :listing
.left.form-field
= f.select( :listing_id, options_from_collection_for_select(Listing.all.sort {|a,b| a.address <=> b.address}, :lid, :address), :prompt => "Please select an address", { :selected => @site.listing_id })
当我进行提交并由于其他一些不相关的原因返回错误时,选择设置为列表中的第一个选项,而不是用户实际选择的选项。
其他一些上下文。以下是注定首先失败的保存的传入参数:
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"X/yqRO0VA0/3GrkGT0sc2KVPd4sVLF2Nd/vnjQM7GOI=", "site"=>
{"domain"=>"butterballasshat.info", "listing_id"=>"937", "user_id"=>"21",
"description"=>"asdf"}, "commit"=>"Save"}
这是相关的控制器代码:
def create
@site = Site.new(params[:site])
respond_to do |format|
if success and @site.save
format.html { redirect_to(sites_url, :notice => 'Site was successfully created.') }
format.xml { render :xml => sites_url, :status => :created, :location => @site }
else
format.html { render :action => "new" }
format.xml { render :xml => @site.errors, :status => :unprocessable_entity }
end
end
end
如果您需要任何其他信息来解决我的问题,我很乐意提供...