0

对 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>

我有两个模型包装工和 packjobs。

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。

4

3 回答 3

1

以下肯定会起作用。

<%= f.select :packer_id, :options_for_select(@packers.map{|p| [p.p_name,p.id]}), {:include_blank => true}%>

于 2012-12-06T04:29:39.083 回答
0

数据模型是问题的根源。pj_packerpacker_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
于 2012-12-06T18:28:11.103 回答
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>
于 2012-12-06T03:19:37.943 回答