hidden_​​field使用两个模型

时间:2012-12-06 00:45:38

标签: ruby-on-rails ruby-on-rails-3 forms

相当新的仍然是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。

3 个答案:

答案 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_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