0

ユーザーがログインすると、home アクションによってユーザーが new_status_update_path にリダイレクトされ、新しい status_update を送信するためのフォームが表示されます。

def home
 if user_signed_in?
  redirect_to new_status_update_path
 end 
end  

次に、status_update_controller 内の新しいアクションは、status_update オブジェクトをビュー フォームに渡すだけで操作できるようになります。

ステータス更新コントローラー:

def new
  @status_update = current_user.status_update.build if user_signed_in?
end 

意見:

<div class="row">
<div class="span6 offset3">
<%= form_for(@status_update) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>

  <%= f.label :weight %>
  <%= f.text_field :weight %>

  <%= f.label :bf_pct %>
  <%= f.text_field :bf_pct %>

  <%= f.submit "Post", class:"btn btn-large btn-primary" %> 
<% end %>

レンダリング エラー:

NoMethodError in StatusUpdatesController#new

 undefined method `>=' for nil:NilClass

app/models/status_update.rb:36:in `default_values'
app/controllers/status_updates_controller.rb:10:in `new'

status_update.rb

class StatusUpdate < ActiveRecord::Base
   belongs_to :user

   after_initialize :default_values

   attr_accessible :current_weight,
               :current_bf_pct,
               :current_lbm,
               :current_fat_weight,
               :change_in_weight,
               :change_in_bf_pct,
               :change_in_lbm,
               :change_in_fat_weight,
               :total_weight_change,
               :total_bf_pct_change,
               :total_lbm_change,
               :total_fat_change,
               :previous_weight,
               :previous_bf_pct,
               :previous_lbm,
               :previous_fat_weight,
               :created_at

   validates :user_id, presence: true
   validates :current_bf_pct, presence: true,
                          numericality: true,
                          length: { minimum: 2, maximum:5 }  
   validates :current_weight, presence: true,
                          numericality: true,
                          length: { minimum: 2, maximum:5 } 
   validates :current_lbm, presence: true
   validates :current_fat_weight, presence: true                   

   def default_values      
     if self.current_bf_pct >= 0.5
       self.current_bf_pct /= 100
        if self.current_bf_pct <= 0.04
          self.current_fb_pct *= 100
        end 
     end
     self.current_fat_weight = self.current_weight * self.current_bf_pct
     self.current_lbm = self.current_weight - self.current_fat_weight
   end  

   def previous_status_update
     previous_status_update = user.status_update.where( "created_at < ? ", self.created_at ).first   
     if previous_status_update == nil
       return self
     else
       previous_status_update
     end
   end 

    default_scope order: 'status_updates.created_at DESC'

 end

ご協力いただきありがとうございます!

4

2 に答える 2

2

の使い方に問題があるようですafter_initialize。私の記憶が正しければafter_initialize、新しいオブジェクトが作成された後に呼び出されます。その時点で、オブジェクトのすべての属性が nil になるため、 のような比較を使用できなくなります>=

編集:

イディオムを使用して値を設定してみると||=、属性が nil の場合にのみデフォルト値が設定されます。したがって、属性が nil の場合は を 0.5self.current_bf_pct ||= 0.5に設定し、それ以外の場合は現在の値を使用します。current_bf_pct

つまり、まだ設定されていない属性の値を比較しようとしているように見えます。

于 2012-09-24T16:53:00.847 に答える
1
undefined method `>=' for nil:NilClass

これは、status_update ファイル内のオブジェクト>=のインスタンス (36 行目) で演算子を使用しようとしていることを意味します。エラーによると。nil

Status Updates Controller を正しく呼び出していること、およびデータが期待どおりに流れていることを確認してください。

于 2012-09-24T16:43:17.517 に答える