相当新的仍然是RoR ...我现在大肆混淆如何完成以下任务:
我在app / views / packjobs / _form.html.erb
下有关注<td><%= f.collection_select(:pj_packer, @packers, :p_name, :p_name, { :include_blank => true} ) %></td>
<%= f.hidden_field :packer_id, :value => @packers.id %>
<td><%= f.text_field :pj_guestpacker %></td>
我有两个模型包装工和包装工具。
class Packjob < ActiveRecord::Base
belongs_to :packer
end
class Packer < ActiveRecord::Base
has_many :packjobs
end
我在控制器中订购了包装工具列表以便下拉,并认为这可能是造成问题的原因。
# GET /packjobs/new.xml
def new
@packjob = Packjob.new
@datestamp = Time.now.strftime("%m/%d/%Y %I:%M:%S %P")
@packers = Packer.find(:all, :conditions => { :p_team => "t" }, :order => "p_name")
@rigs = Rig.find(:all, :conditions => { :rig_status => "t" }, :order => "rig_type_number")
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @packjob }
end
end
packjobs的架构如下:
-- Describe PACKJOBS
CREATE TABLE "packjobs" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"pj_packer" VARCHAR(255) NOT NULL,
"pj_guestpacker" VARCHAR(255),
"pj_rig_type_number" VARCHAR(255),
"pj_damage" VARCHAR(255),
"pj_extranotes" VARCHAR(255),
"created_at" DATETIME,
"updated_at" DATETIME
, "packer_id" integer)
我可以使用Packer名称填充下拉列表:pj_packer;但我想将Packer ID传递给:packer_id。
我一直在:NoMethodError in Packjobs#new undefined method 'id' for #<Array:0xa32828c>
修改
理想情况下,我想要一个隐藏字段来捕获所选包装器的ID。
答案 0 :(得分:1)
以下内容肯定会有用。
<%= f.select :packer_id, :options_for_select(@packers.map{|p| [p.p_name,p.id]}),
{:include_blank => true}%>
答案 1 :(得分:0)
尝试:
<td><%= f.select :packer_id, options_from_collection_for_select(@packers, :id, :p_name, @packjob.packer_id), :include_blank => true %></td>
<td><%= f.text_field :pj_guestpacker %></td>
答案 2 :(得分:0)
数据模型是问题的根源。 pj_packer
和packer_id
正在不同字段中捕获相同的信息。您想删除pj_packer
字段,只需使用关系(packer_id
)。
然后您的观点将变为以下内容:
<td><%= f.collection_select(:packer_id, @packers, :p_name, :p_id, { :include_blank => true} ) %></td>
<td><%= f.text_field :pj_guestpacker %></td>
然后,如果您需要旧的pj_packer
值,则可以调用@packjob.packer.p_name
而不是@packjob.pj_packer
来获取相同的值,而无需额外的字段。
如果由于其他原因仍需要保留pj_packer
字段,可以在保存回调之前设置它:
class Packjob < ActiveRecord::Base
belongs_to :packer
before_save :set_pj_packer
def set_pj_packer
self.pj_packer = packer.try(:p_name)
end
end