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>

私は2つのモデルのパッカーと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)

ドロップダウンに:pj_packerの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

試す:

<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 に答える
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 に答える