2011-10-08 16 views
8

Bir has_one dernek modeline accepts_nested_attributes_for kullanmaya çalışıyor ve ben iki model, bir kullanıcı ve bir konum yok :-(kesinlikle hiçbir yerdeRaylar 3.1: accepts_nested_attributes_for ve has_one ilişkilendirmesi - çalışmaz mı?

alıyorum Bir kullanıcı bir konuma sahiptir.

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 

Düzenleme kullanıcı sayfasında iki form var.Önceki kullanıcı özniteliklerini günceller (ve iyi çalışır ve aşağıda gösterilmemiştir) ve daha sonra kullanıcının bir bağlantıyı güncellemesine izin veren "current_location_text" olarak adlandırılan konum modelinin ribute değeri:

<%= 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 %> 

Bu çalışmaz. Formun gönderdiği params yanlış görünce biraz kafam karıştı.

  1. var "COMMIT" mesajı yok ancak hiçbir önceki güncelleme dizeyle ve: Bu konuda tuhaf buluyorum

    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 
    

    İki şey: form gönderildiğinde, bu günlükte olduğu hata yok. Örneğin, korumalı bir öznitelik yüklemeye çalıştıysanız, bu noktada "kitle atayamazsınız ..." hata iletisini alırsınız.

  2. Params bana yanlış görünüyor. Böyle bir şey ben beklediğiniz gibi "konum" bit yuvalanmış, ama aynı zamanda bu bir "kullanıcı" karma içinde yuvalanmış olmasını beklersiniz:

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

sanmıyorum Burada tamamen aptalım. Gerçekten çok açık bir şey mi eksik? Formuma ek gizli alanlar eklemeyi denedim, bir kullanıcı kimliği, ve sonra kullanıcı karma, ama "konum" karma ile aynı düzeyde ve beklediğiniz gibi bir ebeveyn olarak değil!

def @user = User.find ([: id] params) güncelleştirmek: Burada

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

ve oluyor eğer yardımcı olur

Ayrıca burada benim UsersController içinde my update yollarımda ne var (ilgili olduğunu düşünmeme rağmen):

Herhangi bir yardım takdir edildi. Bunu çözmezsem, dizüstü bilgisayar pencereden dışarı çıkıyor .... Teşekkürler.

cevap

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

için yüklenmesi sahip olmak istediğini dernek rayları anlatmak deneyin.Böyle aslında "iç içe" formunuzda içindeki fields_for, gerekir:

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

Dokümantasyon Referansı? Belgelerin tamamını görebildiğim, “<% -%>” ifadesinin boşluk ile başa çıkmak olduğunu söylüyor. (http://api.rubyonrails.org/classes/ActionView/Base.html) – 0112

+0

Netleştirmek gerekirse, problem 'fields_for' vs' f.fields_for' idi. '-%>' sadece alışkanlıktı. –

5

yerine bu

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

Aksine o nesnenin kendisini vermektense, bu senin sorunun

+0

teşekkürler - aslında çok bunu yapmak için gerekli, ben tuhaf fields_for bildiriminde bir nesne kullanarak çalışmıyor bulmak. – DaveStephens

+0

Satır içi doğrulama için Hakge gemini kullanan herkes için: Bu yöntemle hatalar alacaksınız. Judge öğeye başvurması gerektiğinden, sembol yerine @ user.location kullanın. – bradleygriffith

İlgili konular