0

私はこの方法をとっています。私はエラーを理解することができません

Couldn't find Company without an ID

ActiveRecord::RecordNotFound in CustomersController#bulk_create

このメソッドは、会社の顧客の名前と番号を形式で取得することにより、顧客を一括で作成するように記述されていますname:number

方法は次のとおりです。

def bulk_create
res = ""
comp_id = params[:customer][:selected_companies].delete_if{|a| a.blank?}.first
comp = Company.find(comp_id)
s = SentSmsMessage.new
s.set_defaults
s.data = tmpl("command_signup_ok", customer, comp) unless params[:customer][:email].length > 0
s.data = params[:customer][:email] if params[:customer][:email].length > 0
s.company = comp if !comp.nil?
s.save
unless comp_id.blank?
  params[:customer][:name].lines.each do |line|
    (name, phone) = line.split(/\t/) unless line.include?(":")
    (name, phone) = line.split(":") if line.include?(":")
    phone = phone.gsub("\"", "")
    phone = phone.strip if phone.strip.to_i > 0
    name = name.gsub("\"", "")
    name = name.gsub("+", "")
    phone = "47#{phone}" if params[:customer][:active].to_i == 1
    customer = Customer.first(:conditions => ["phone_number = ?", phone])
    if customer.nil?
      customer = Customer.new
      customer.name = name
      # customer.email
      # customer.login
      # customer.password
      customer.accepted_agreement = DateTime.now
      customer.phone_number = phone
      customer.active = true
      customer.accepted_agreement = DateTime.now
      customer.max_msg_week = params[:customer][:max_msg_week]
      customer.max_msg_day = params[:customer][:max_msg_day]
      customer.selected_companies = params[:customer][:selected_companies].delete_if{|a| a.blank?}
      res += "#{name} - #{phone}: Create OK<br />" if customer.save
      res += "#{name} - #{phone}: Create failed<br />" unless customer.save
    else
      params[:customer][:selected_companies].each do |cid|
        new_company = Company.find(cid) unless cid.blank?
        if !new_company.nil? 
          if !customer.companies.include?(new_company)
            customer.companies << new_company
            if customer.save
              res += "#{name} - #{phone}: Customer exists and the customer was added to the firm #{new_company.name}<br />"
            else
              res += "#{name} - #{phone}: Customer exist, but something went wrong during storage. Check if the client is in the firm.<br />" 
            end
          else
            res += "#{name} - #{phone}: Customer exists and is already on firm #{new_company.name}<br />"
          end
        end
      end
    end
    s.sms_recipients.create(:phone_number => customer.phone_number)
  end
  s.save
  s.send_as_sms
  @result = res
  respond_to do |format|
      format.html { render "bulk_create"}
  end
else
  @result = "You have not selected any firm to add these users. Press the back button and try again."
  respond_to do |format|
      format.html { render "bulk_create"}
  end
end
end

ここで 1 つの状況を更新したいと思います。フォームを空白で送信すると、このエラーが発生します。また、フォームに値を入力すると、失敗した場合にメソッドが返す状況が表示されます。

 res += "#{name} - #{phone}: Create failed <br />"

tmpl方法_

private
def tmpl(setting_name, customer, company = nil)
text = ""
 if customer.companies.count > 0
   sn = "#{setting_name}_#{@customer.companies.first.company_category.suffix}".downcase rescue setting_name
   text = Setting.value_by(sn) rescue ""
 end
textlenth = text.length rescue 0
 if textlenth < 3
   text = Setting.value_by(setting_name) rescue Setting.value_by("command_error")
 end
 return fill_template(text, customer, company)
end

モデルからcustomer.rb

    def selected_companies=(cmps)
  cmps.delete("")
  # Check the old ones. Make a note if they are not in the list. If the existing ones are not in the new list, just remove them
  self.companies.each do |c|
    self.offer_subscriptions.find(:first, ["customer_id = ?", c]).destroy unless cmps.include? c.id.to_s
    cmps.delete c.id.to_s if cmps.include? c.id.to_s
    end

  # Then create the new ones
  cmps.each do |c2|
    cmp = Company.find(:first, ["id = ?", c2])
    if cmp && !c2.blank?
      offerSubs = offer_subscriptions.new
      offerSubs.company_id = c2
      offerSubs.save
    end
  end
end

    def selected_companies
       return self.companies.collect{|c| c.id}
    end

顧客の関連付けは次のとおりです。

has_many :offer_subscriptions
has_many :companies, :through => :offer_subscriptions

このコードは他の誰かによって書かれています。この方法を理解しようとしていますが、これまでのところこのコードを理解できていません。助けてください。前もって感謝します。

4

4 に答える 4

0

これを試して:

  comp = ""
  comp = Company.find(comp_id)  unless comp_id.nil?

それ以外のcomp = Company.find(comp_id)

コードに存在することをさらにnil確認します。

于 2013-05-28T11:10:17.270 に答える
0

Company テーブルに id = comp_id のレコードが含まれていないため、「Couldn't find Company without an ID」エラーが発生しています

に変更comp = Company.find(comp_id)comp = Company.find_by_id(comp_id)ます。

これは、エラーの代わりに nil を返します。

追加comp is not nil条件はコードで既に処理されています。

于 2013-05-28T10:35:13.307 に答える