2011-10-08 4 views
8

ユーザは、1つの場所を持っています。Rails 3.1:accepts_nested_attributes_forとhas_oneの関連付けは機能しませんか?私はhas_oneの関連付けモデルにaccepts_nested_attributes_for使用しよう、と私は2つのモデル、ユーザと場所を持っている:-(絶対にどこにも</p> <p>を取得していないよ

class User < ActiveRecord::Base 
    # current location 
    has_one :location, :dependent => :destroy 
    accepts_nested_attributes_for :location 
end 

class Location < ActiveRecord::Base 
    belongs_to :user 
end 

私は編集ユーザーページに2つのフォームがあります。メインユーザー属性を更新するものと、正常に動作するものがあります。以下に示されていない)、そして、ユーザがattを更新することを可能にするこの"current_location_text"と呼ばれるロケーションモデルのリルート:

<%= form_for(@user) do |f| %> 
    <%= fields_for(@user.location) do |location_fields| %> 
     <%= location_fields.label :current_location_text, 'Current Location' %> 
     <%= location_fields.text_field :current_location_text, :placeholder => 'Road, City or Postcode' %> 
    <% end %> 

    <%= f.submit "Update Current Location" %> 
<% end %> 

これは機能しません。フォームから送信されたパラメータが正しく表示されないので、私は少し混乱します。フォームが送信されると、これは、ログにあります。私はこのことについて奇妙な見つける

Started PUT "https://stackoverflow.com/users/1" for 127.0.0.1 at 2011-10-08 00:28:05 +0100 
    Processing by UsersController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"YdTAsXwEvRgXIqri+jfx3dLlYG2XWQTuYkgLDsO/OJw=", "location"=>{"current_location_text"=>"E14 8JS"}, "commit"=>"Update Current Location", "id"=>"1"} 
    User Load (10.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 
    User Load (5.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = ? LIMIT 1 [["id", "1"]] 
    SQL (4.4ms) BEGIN 
    (2.5ms) COMMIT 
Redirected to http://localhost:3000/users/1 

2つのこと:

  1. あり、「COMMIT」のメッセージだ、ない前の更新文字列を持つ、とエラーはありません。例えば、あなたがプロテクトされたアトリビュートをコミットしようとすると、その時点で "あなたはマスを割り当てることはできません"というエラーメッセージが表示されます。

  2. paramsは私に間違って見えます。 「場所」ビットは、私が期待するようにネストされていますが、私はまた、これは、「ユーザー」のハッシュ内にネストされることを期待したい、このような何か:私は考えていない

    {"utf8"=>"✓", "authenticity_token"=>"YdTAsXwEvRgXIqri+jfx3dLlYG2XWQTuYkgLDsO/OJw=", "user"=>{"location"=>{"current_location_text"=>"E14 8JS"}, "commit"=>"Update Current Location", "id"=>"1"}} 
    

私はここでは完全に馬鹿だ。本当に明白な何かが欠けていますか?私は私のフォームに余分な隠しフィールドを追加しようとしました、つまりユーザーIDですが、私はユーザーハッシュを取得しますが、 "location"ハッシュと同じレベルで、

DEF @user = User.find([:ID]のparams)更新:ここ

if @user.update_attributes(params[:user]) 
    redirect_to current_user, :notice => 'User was successfully updated.' 
else 
    render :action => "edit" 
end 

エンド

をしています、それは場合に役立ちます

また、ここに私がUserController内の私の更新です私のルートには何が入っているのですか(それは関係ないと思いますが):

resources :users do 
    resource :location 
end 

何か助けに感謝します。私がこれを解決しなければ、ラップトップは窓から外に出ています.... ありがとう。

答えて

11
<%= fields_for(@user.location) do |location_fields| %> 

のためにこれはあなたの問題でロードしたいものを連想レールを教えてください。あなたは、このような実際には「巣」フォーム内のfields_for、行う必要があります。

<% f.fields_for(@user.location) do |location_fields| -%> 
+0

ドキュメントの参照先私が言うことがわかるのは、 '<% -%>'は末尾の空白を扱うということです。 (http://api.rubyonrails.org/classes/ActionView/Base.html) – 0112

+0

明確にするために、問題は 'fields_for'と' f.fields_for'でした。 ' - %>'はちょうど習慣でした。 –

5

<%= f.fields_for :location do |location_fields| %> 

よりもむしろそれをオブジェクト自体を与える代わりにこれを試してみてください、あなたはそれが

+0

おかげで - 私は実際にあまりにもこれを行うために必要な、私はそれが奇妙なfields_for宣言でオブジェクトを使用して動作していないことが判明します。 – DaveStephens

+0

インライン検証にJudge gemを使用する人は、この方法でエラーが発生します。 Judgeはオブジェクトを参照する必要があるため、シンボルではなく@ user.locationを使用します。 – bradleygriffith