0

我的應用程序有一個動物模型,它有許多(並接受嵌套屬性)包。在我的動物控制器中,我創建了以下動作以允許在用於正常動物編輯的單獨頁面(以及單獨的用戶角色)中編輯某些Animal(和嵌套Package)屬性。 (爲了澄清,我有一個動物#編輯操作和頁面,和一個單獨的動物#日誌動作和頁面,在理想情況下允許不同的用戶角色編輯關於動物不同的東西):Rails自定義嵌套更新不更新

def log 
    @animal = Animal.find(params[:animal_id]) 

    if params[:animal] 
     if @animal.update_attributes(params[:animal]) 
     # I want a basic reload (with flash) in cases of both success and failure. 
     redirect_to log_path(@animal), notice: "Animal update successful!" 
     else 
     redirect_to log_path(@animal), notice: "Update unsuccessful. Contact admin" 
     end 
    end 
end 

我單獨編輯/更新操作:

def update 
    @animal = Animal.find(params[:id]) 

    if @animal.update_attributes(params[:animal]) 
     redirect_to @animal, notice: "Animal was successfully updated." 
    else 
     render action: "edit" 
    end 
    end 

def edit 
    @animal = Animal.find(params[:id]) 
end 

的問題是,當我打在我的日誌頁面(下面的代碼)我的提交按鈕,它刷新頁面,但)沒有任何類型(小問題)的任何通知,和b )更重要的是,沒有實際更新包信息。重要的是,如果我更新animal.weight屬性(這裏唯一可修改的ANIMAL屬性),那麼它就可以工作。只是不是嵌套包的屬性。

幫助?我真的很難過。我一直在擺弄這個永遠試圖讓它工作。下面的一些可能的相關代碼:

在我的routes.rb文件(上述動物資源):

match '/animals/:animal_id/log' => "animals#log", as: :log 

這裏是我的日誌查看:

<%= form_for(@animal, :url => { :action => "log" }, :method => :put) do |f| %> 

    <div style="width: 200px"> 
     <% if @animal.weight %> 
      <%= "Weight: #{@animal.weight}lbs" %> 
     <% else %> 
      <%= f.label "Weight (in lbs)" %> 
      <%= f.text_field :weight %> 
     <% end %> 
    </div> 

    # I'm cycling through each bundle to group "identical" packages in a table (one per bundle). 

    <% @animal.sold_bundles.each do |bundle| %> <!-- Packages are bundled by cut and prep notes --> 
     <%= render partial: 'package_bundle', locals: {:bundle => bundle, :f => f} %><br> 
    <% end %> 

    <%= f.submit "Submit Animal Log", :class => "btn image-button right" %> 

<% end %> 

而這裏的 「package_bundle」 部分要求每個捆綁。它產生包的表,有些編輯(因爲空白true_weight值),有的不是:

<table class="table"> 
    <thead> 
     <tr> 
      <th>Cut Name</th> 
      <th>Prep Notes</th> 
      <th>Label</th>    
      <th>Actual Lbs</th> 
      <th>Actual Oz</th> 
     </tr> 
    </thead> 
    <tbody> 
     <!-- list of specified packages --> 
      <%= f.fields_for :packages, bundle do |p| %> 
        <tr> 
         <td><%= p.object.name %></td> 
         <td><%= "#{p.object.user.name.first(3).upcase}-#{p.object.id}" %></td> 
         <% if p.object.true_weight == nil || p.object.true_weight == 0 %> 
          <td colspan=1><%= p.text_field :actual_lbs %></td> 
          <td colspan=1><%= p.text_field :actual_oz %></td> 
         <% else %> 
          <td><%= p.object.true_weight.round(0) %> lb</td> 
          <td><%= ((p.object.true_weight % 1) * 16).round(2)%> oz </td> 
         <% end %> 
        </tr> 
      <% end %> 

    </tbody> 
</table> 

編輯 - 要求更多的代碼

package.rb(只是什麼是相關的) - 我回避下面的問題(這次,我以前肯定犯過這個錯誤)。這是一個可能性,我的磅/盎司轉換爲磅與百分比的方法是這裏怪,但它的權利在我看來:

class Package < ActiveRecord::Base 
    attr_accessible :animal_id, :cut_id, :price, :line_id, :sold, :savings, :actual_lbs, :actual_oz, :true_weight 
    attr_accessor :actual_lbs, :actual_oz 
    belongs_to :animal 
    belongs_to :cut 
    belongs_to :line 
    before_update :to_true 

def to_true 
    if self.sold 
     if self.order.status > 1 # This is the case for any package loaded on the log page 
     if self.actual_lbs && self.actual_oz 
      unless self.true_weight && self.true_weight > 0 # Don't overwrite legit true weights 
      percent = self.actual_oz/16 
      self.update_attribute(:true_weight, self.actual_lbs + percent) 
      end 
     end 
     end 
    end 
    end 

animal.rb(僅適用):

class Animal < ActiveRecord::Base 
    attr_accessible :breed, :name, :photo, :animal_type, :hanging_weight, :meat_weight, 
        :weight, :ranch_id, :butcher_id, :cow_mult, :pig_mult, :packages_attributes, 
        :lamb_mult, :goat_mult, :host_id, :final_sale, :opening_sale, :open, :no_sales 
    has_many :orders 
    has_many :packages 
    belongs_to :butcher 
    belongs_to :ranch 
    belongs_to :host 
    after_create :create_packages 

    accepts_nested_attributes_for :packages 

看着在我的服務器日誌中(我比開發日誌更容易理解),深入瞭解這一點,並注意到兩件奇怪的事情。沒有任何錯誤,但1)它似乎在我加載時執行頁面的GET,但是當我點擊提交時不是所請求的PUT,並且2)可能作爲結果,唯一的參數通過(它作爲GET請求的一部分)是動物ID;沒有包屬性被傳遞。

回答

1

attr_accessor不會觸發回調。你必須做一個變量「髒」。更多信息here

在你package.rb

def actual_lbs=(val) 
    true_weight_will_change! 
    @actual_lbs=val 
end 

這將使它這樣,當它集actual_lbs變量,它會「髒」的變量是在數據庫中,從而發射回調。

2

你可以發佈你的型號代碼嗎?想到的一個常見的「疑難雜症」,在你的案例中,package_attributes與動物模型上的attr_accessible沒有增加。它不會引發錯誤,但是塞入開發日誌中,在SQL條目之前,您將看到批量分配警告。

+0

剛剛這樣做。感謝您的迴應!就SO反應遲到而言,我一直處於負面狀態。也許我的問題只是越來越:) :) – Sasha

+0

所以@Sasha - 這是否回答你的問題?如果是這樣,你能否將其標記爲已接受。如果不是,它看起來像'animal.rb'類具有必需的':packages_attributes'訪問器,但是可能在'after_create'回調之間存在衝突,這表明它正在執行'accept_nested_attributes_for'自動執行的工作。檢查你的development.log,看看實際發生了什麼。 –

+0

那麼,我沒有能夠解決上述問題。在這種特殊情況下,不會使用after_create回調。它被用於(成功)在另一頁上以創建與動物相關的包對象,並在動物製作時具有特定屬性。由於我有:packages_attributes行,我仍然不知道發生了什麼。我即將進入開發日誌查看。 – Sasha