簡體   English   中英

Rails 3.1:accepts_nested_attributes_for和has_one關聯 - 不起作用?

[英]Rails 3.1: accepts_nested_attributes_for and has_one association - won't work?

我正在嘗試在has_one關聯模型上使用accepts_nested_attributes_for,並且絕對無處:-(

我有兩個模型,一個用戶和一個位置。 用戶有一個位置:

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

我可以通過User.find(1).location.current_location_text = "blah"保存對模型的更改,因此我知道關聯設置正確。

我在編輯用戶頁面上有兩個表單。 一個更新主要用戶屬性(並且工作正常並且未在下面顯示)然后允許用戶更新位置模型的屬性,稱為“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 "/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

我發現有兩件事奇怪:

  1. 有“COMMIT”消息,但沒有先前的更新字符串,也沒有錯誤。 例如,如果您嘗試提交受保護的屬性,那么此時您將收到“您無法批量分配...”錯誤消息。

  2. params看起來對我不對。 “location”位嵌套正如我所期望的那樣,但我也希望這是嵌套在“user”哈希中,如下所示:

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

我不認為我在這里完全是傻瓜。 我錯過了一些非常明顯的東西嗎 我已經嘗試在我的表單中添加額外的隱藏字段,即用戶ID,然后我獲得用戶哈希,但與“位置”哈希處於同一級別,而不是我期望的父級!

如果它有幫助,這是我在UsersController中的更新:

def update @user = User.find(params [:id])

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

結束

這是我的routes.rb中的內容(雖然我不認為它是相關的):

resources :users do
  resource :location
end

任何幫助贊賞。 如果我不解決這個問題,筆記本電腦就會出現在窗外......謝謝。

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

這是你的問題。 你需要在表單中實際“嵌套”fields_for,如下所示:

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

試試這個

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

而不是給它自己的對象,告訴rails你想要加載什么關聯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM