-1

私は Teacher payslip Controller ですが、オブジェクトを使用して net_salary を取得すると、その値ではなくブール値が表示されます。

def payslip_report
if params[:teacher_id] and params[:month_year].present?
   @month_and_year =   params[:month_year].gsub(' ','')
   @teacher_data   =   TeacherPayslip.where(:teacher_id => params[:teacher_id])
   @matched_records = @teacher_data.select{|t| t.salary_date.strftime("%B%Y") == @month_and_year}
   #returns an array of TeacherPayslip records with matching month and year
  if @matched_records.blank?
     raise "2" 
     else
     @report = @matched_records.first
     raise @report.net_salary.inspect

  end
end

終わり

@report.net_salary を調べると true が表示されます。@report には、basic,pf,da,net_salary 値が含まれます。@pf = @report.pf は、pf 値を取得することを意味します。しかし、net_salary を取得しようとすると、float 値ではなく Boolean 値が表示されます。

raise @report.inspect を含む

ここに画像の説明を入力

これがTeacherPayslipモデルです

 class TeacherPayslip < ActiveRecord::Base
    attr_accessible :teacher_id,:salary_date,:hra,:bonus,:pf,:da,
                  :special_allowance,:basic,:net_salary,:month_year

   #associations
   belongs_to :teacher


  #callbacks                
    after_create :net_salary

    def net_salary   
        @teacher_id = self.id
        @da  =  (self.basic * self.da)/100 
        @hra = (self.basic * self.hra)/100 
        @gs  = @da + @hra + self.basic
        @pf =  (@gs * self.pf)/100
        @netsalary = @gs - @pf + self.special_allowance + self.bonus
    @a = TeacherPayslip.find(@teacher_id)
    #raise @a.inspect
    @a.update_attribute('net_salary',@netsalary)
  end
end
4

1 に答える 1

0

正味給与メソッドをオーバーライドしたため、列の値が返されなくなりました。メソッドは、最後のコマンドによって返された値を返します。この場合、net_salary メソッドはモデルを更新できたかどうかを返します。最後に追加net_salaryすると、すべてが正常に戻るはずです。

ただし、ここでさらにいくつかのポイントがあります。Update_attributeオブジェクトを保存しますが、それを呼び出した人にとっては驚くかもしれません。また、すべての検証をスキップします。つまり、次のことを意味します。

t = TeacherPayslip.new
t.net_salary

空のオブジェクトを db に保存します。代わりに `assign_attributes net_salary: @netsalary' を使用してください。

また、新しい TeacherPayslip を検索する意味はありません (また、新しいレコードに対して例外がスローされます)。使用するだけで、.self.assign_attributes...スキップすることもできますself

于 2013-10-12T10:48:21.673 に答える