2016-07-27 3 views
3

私はRails 4.2.7を使用しています。私のモデルでは、私はRoRでは、f.fields_forは何も描画しません。

class MyObject < ActiveRecord::Base 
    … 
    belongs_to :address, :autosave => true, dependent: :destroy 

    accepts_nested_attributes_for :address, :my_object_times 

とアドレスモデルを持っている

class Address < ActiveRecord::Base 
    belongs_to :state 
    belongs_to :country 
    ... 
    has_one :my_object 

end 

私は私が子供と親の両方のオブジェクトを構築することができますフォームを書きたいので、私は

<%= form_for @my_object, :url => my_objects_create_path, :remote => true do |f| %> 

    <div class="field"> 
    <%= f.fields_for :address do |addr| %> 
    <%= addr.label :address %> <span name="my_object[address]_errors"></span><br> 
    City: <%= addr.text_field :city %> 
    <%= addr.select :state, options_for_select(us_states.collect{|s| [ s.name, s.id ]}), {:prompt => "Select State"} %> 
    <%= country_code_select('my_object[address]', 'country_id', 
       [[ 'US', 'United States' ], [ 'CA', 'Canada' ]], 
       {:include_blank=>true, :selected => @default_country_selected.id}, 
       {:class=>'countryField'} 
      ) %> 
    <% end %> 
    </div> 
を試してみました

ただし、上記は唯一として表示されます

<div class="field"> 
</div> 
私のフィールドがレンダリングされるように

は、どのように私は物事を調整しないと私は使用して私のコントローラで私のオブジェクトを作成することができるよ

my_object = MyObject.new(params) 

編集:答えは1が与えられ、私が試した

@my_object.address.build 

フォームをrendres taht tehのコントローラのアクションから、しかしmy_objectはありません、その後、何のアドレスを持っていない場合はerorr

undefined method `build' for nil:NilClass 

答えて

1

#これを持っていることは、フォームのロードクラスで

def new 
    @myobject = MyObject.new 
    @myobject.address = Address.new 
end 

ですDEF作成されます

def create 
@myobject = MyObject.new(myobject_params) 
@myobject.save 
end 

#IN paramsは

def myobject_params 
params.require(:myobject).permit(:some, :key,:of, :myobject, :address_attributes[:address, :attribute]) 
end 

#これは

+0

"@ myobject.address.new"行の "nil:NilClass"に "未定義メソッド' new "というエラーがあります – Dave

+0

回答が更新されました。 –

1

を得ました物がレンダリングされます。これはRailsのデフォルト動作です。フィールドの少なくとも一つのセットがユーザーに表示されるように、この問題を回避する1つの方法は、コントローラ内の1人のまたは複数の空の子供を構築することです

Railsはネストされたこの程度guides話はまた、セクション9.2

フォーム、あなたのMyObjectモデルでは、私はそれがhas_one addressであるべきだと思います。あなたは住所

<%=form_for(@myobject) do |f|%> 
<%=f.fields_for :address do |a|%> 
    Your form fields here 
    <%end%> 
<%end%> 

#このため、ネストされた属性を使用することができます#Nowあなたはbelongs_to

class MyObject < ActiveRecord::Base 
    has_one :address, :autosave => true, dependent: :destroy 
    accepts_nested_attributes_for :address 
end 
+0

マイ "my_objects" テーブル "はアドレス" テーブルに戻ってリンクする "ADDRESS_ID" 欄があります動作するはずです。それでは、あなたはまだ関係は "have_ *"でなくob "belongs_to"でなければならないと言いますか? – Dave

+0

「my_object」が何を指しているのかわからないので、データアソシエーションをどのように構造化すべきかは言えません。 '@ my_object.address.build'がそのエラーを出す理由は、' has_many'関連では、ビルダーは '@ my_object.addresses.build'でなければならないからです。あるいは、それは 'has_one'かもしれません。どちらの方法でも、ネストされたフォームでは、子オブジェクトが親オブジェクトを 'belongs_to'するのに意味があります。私はあなたがそれを他の方法で動作させることができるかどうか分かりません。正直なところ分かりません。 – Ren

+0

多分、新しいアクションのmy_objectコントローラに空の 'address'インスタンスオブジェクトを持っていて、フォームを取得しようとします。レンダリングする。それが役立つかどうかを確認してください – Ren

関連する問題