1

私はabsense.html.erb開発と生産でうまく機能するものを持っています。ただし、ページにアクセスしようとすると、次のエラーが発生します。

2013-03-25T18:43:43 + 00:00 app [web.1]:2013-03-25 18:43:43+00002013-03-25T18:43に77.100.90.77のGET"/absence"を開始しました:43 + 00:00 app [web.1]:2013-03-25T18:43:43 + 00:00 app [web.1]:ActiveRecord :: StatementInvalid(PG :: Error:ERROR:column "requested" does存在しません2013-03-25T18:43:43 + 00:00 app [web.1]:行1:...LECT"holidays"。*FROM"holidays" WHERE(state = "requested ... 2013-03 -25T18:43:43 + 00:00 app [web.1]:
^ 2013-03-25T18:43:43 + 00:00 app [web.1] ::SELECT"holidays"。*FROM"holidays" WHERE (state = "requested")):2013-03-25T18:43:43 + 00:00 app [web.1]:2013-03-25T18:43:43 + 00:00 app [web.1]:2013 -03-25T18:43:43 + 00:00 app [web.1]:
app / controllers / holidays_controller.rb:52:in `absence '2013-03-25T18:43:43 + 00:00 heroku [router]:at = info method = GET path = / rota_days host=miuk-portal.herokuapp。 com fwd = "77.100.90.77" dyno = web.1 queue = 0 wait = 0ms connect = 1ms service = 5773ms status = 200 bytes = 897173

エラーは、コントローラーのabsenseメソッドの次の行を示しています

def absence
#show the holidays where the approver id matches the current user id
#and state = "requested"'

    @user = current_user
    if current_user.role? :administrator
      # a superadmin can view all current holiday requests
      @holidays = Holiday.find(:all, :conditions => 'state = "requested"')
    else
      #otherwise an admin sees the holiday requests that they are approvers for
      @holidays = Holiday.find(:all, :conditions => ["approver_id = #{current_user.id}", "state = requested"])
    end
  end

以下に示すように、休日モデルでこれを宣言しました。

Holiday.rb

class Holiday < ActiveRecord::Base

  belongs_to :user
  belongs_to :calendar
  belongs_to :type, :class_name => "Type"
  belongs_to :approver, :class_name => "User"


  before_create :default_values #Before creating holiday set default_values
                                #before_create :overflow


  validates :start_at, :presence => { :message => "must be a valid date/time" }
  validates :end_at, :presence => {:message => "must be a valid date/time"}
  validate :start_must_be_before_end_date
  validate :overflow #Hook method to determine if user holidays are over the set amount
  validates_presence_of :end_at, :start_at

  attr_accessible :description, :end_at, :start_at, :state, :type_id, :user_id, :color


  def length
    (self.end_at.to_i - self.start_at.to_i)/(60*60*24)
  end

  def days_used
    ( (start_at.to_date)..(end_at.to_date) ).select {|d| (1..5).include?(d.wday) }.size
  end


  #Validates_presence_of is called to ensure that the start date exisit.
  #Start date must be lt or = to end date otherwise throw error.
  def start_must_be_before_end_date
    errors.add(:start_at, "must be before end date") unless
        self.start_at <= self.end_at
  end

  #Overflow of holidays is validated by calling "validates" L31. Then checks if absent days
  #Is gt or = to length
  def overflow
    errors.add(:overflow, "- You only have #{user.absentdays} days holiday remaining; this absence is #{length} days.") unless
        user.absentdays >= length
  end

  def name
    return self.user.name
  end

  def colors
    if state ||= "denied"
      return self.color ||= "#C00000"

    end
  end

  private

  #Setting default values - before_create is called and sets the following
  def default_values
    self.state ||= "requested"
    self.color ||= "#000000"
    self.type_id||= 1
  end
end

これが開発と本番の両方で機能し、herokuでは機能しない理由を理解していないようです。何か案は?

4

1 に答える 1

2

標準のSQL文字列は一重引用符を使用し、二重引用符は識別子(テーブル名や列名など)用です。PostgreSQLはここでの標準に従い、MySQLとSQLiteはそれほど厳密ではなく、他のデータベースはさまざまな程度の厳密さで他のことを行います。いずれの場合も、SQL文字列リテラルの一重引用符はどこでも同じように機能するはずです。

SQL文字列に二重引用符を使用しています。

@holidays = Holiday.find(:all, :conditions => 'state = "requested"')
#------------------------------------------------------^---------^

一重引用符で囲む必要があります。

@holidays = Holiday.find(:all, :conditions => %q{state = 'requested'})

または、それを最新化して、ActiveRecordに引用を処理させます。

@holidays = Holiday.where(:state => 'requested')

おそらく、これの引用も修正する必要があります。

@holidays = Holiday.find(:all, :conditions => ["approver_id = #{current_user.id}", "state = requested"])

繰り返しますが、それを近代化するのが最も簡単な方法です。

@holidays = Holiday.where(:approver_id => current_user.id, :state => 'requested')

あなたはSQLiteで開発しているが、PostgreSQLで展開していると思います。これは悪い考えです。常に同じスタックで開発およびデプロイしてください。

于 2013-03-25T19:11:27.983 に答える