Ruby on rails rails 3应用程序中的控制器没有方法错误
我有一个小ruby应用程序在运行,但有一个部分有问题。当我调用create视图时,我使用一个表单,它在post请求中传递一些参数。我关心的唯一参数是id字段,然后在代码中使用该字段在模型中执行一些有用的操作。当我尝试获取由CREATE请求形成的新创建的对象并立即对其调用class方法时,问题就开始了。我为对象创建的类方法称为create,我想从initialize方法调用该方法。当我从initialize方法中删除对create方法的调用时,一切都会顺利运行,这表明我基本上是正确的 请求后参数:Ruby on rails rails 3应用程序中的控制器没有方法错误,ruby-on-rails,model-view-controller,Ruby On Rails,Model View Controller,我有一个小ruby应用程序在运行,但有一个部分有问题。当我调用create视图时,我使用一个表单,它在post请求中传递一些参数。我关心的唯一参数是id字段,然后在代码中使用该字段在模型中执行一些有用的操作。当我尝试获取由CREATE请求形成的新创建的对象并立即对其调用class方法时,问题就开始了。我为对象创建的类方法称为create,我想从initialize方法调用该方法。当我从initialize方法中删除对create方法的调用时,一切都会顺利运行,这表明我基本上是正确的 请求后参数:
{"utf8"=>"✓",
"authenticity_token"=>"fCQw3Pegyv069jO0tZ4eY5buslyAM/r8yrG7phyoJqI=",
"id"=>"20110806",
"commit"=>"Create"}
财务总监报告的相关部分
def create
@report = Report.new(params[:id], Time.now)
end
在报告类中初始化方法,该方法也是一个模型,并在routes文件中声明为资源,仅使用show、new、create as controller操作
class Report
attr_accessor :date, :file_path, :time_created
REPORT_DIR = "/home/ben/Desktop"
date_format = "%Y%m%d"
def initialize(report_date, timestamp)
@date = report_date
@file_path = REPORT_DIR+"/#{date}-orders.txt"
@time_created = timestamp
create unless FileTest.exist?(@file_path)
end
def create
@orders = ShopifyAPI::Order.find(:all, :params => { :created_at_min => "#{@date} 00:00", :created_at_max => "#{@date} 23:59", :order => "created_at DESC" })
File.open(@file_path, 'w') { |f|
@orders.each do |order|
# begin line 1
line1 = "850 00000000000" # standard way to start the line
line1 += order.id.to_s # adding the order id
oid_len = order.id.to_s.length # calculating the length of the order number to
no_spaces = 22 - oid_len # place the appropriate number of white space
no_spaces.times do
line1 += " "
end
line1+= "PO " # PO + 15 spaces
line1+= "PARTNER KEY "# this line is 30 chars total, readjust when partner key comes in
line1+= "0000020552078 0001 004010 X X401 P P"
f.write (line1+"\n") # end of line 1
# begin line 2
line2 = "850 BEG0020000000NE" # standard way to start the line
line2 += order.id.to_s # add the order id
no_spaces = 52 - oid_len # calculate the necessary amount of spaces
no_spaces.times do
line2 += " "
end
line2 += order.created_at.strftime(date_format) # add the order creation date
f.write (line2+"\n") # end of line 2
# begin line 3
line3 = "850 DTM017000000" # standard way to start the line
line3 += "02" # standard
line3 += order.created_at.strftime(date_format) # order creation date
f.write (line3+"\n") # end of line 3
# begin line 4
line4 = "850 N1 04700000" # standard way to start the line
line4 += "ST " # standard Ship to qualifier with a space
full_name = order.customer.first_name+" "+ order.customer.last_name # get the customers full name
name_len = full_name.length # determine the length of the name
no_spaces = 60 - name_len # to calculate the number of spaces needed
line4 += full_name
no_spaces.times do
line4 += " "
end
line4 += "9 "
line4 += order.customer.id.to_s # add the customer ID
f.write (line4+"\n") # end of line 4
# begin line 5
line5 = "850 N3 05000000" # standard way to start the line
line5 += order.shipping_address.address1 # add the first line of the billing address
f.write (line5+"\n") # end of line 5
# begin line 6
line6 = "850 N4 05100000" # standard way to start the line
line6 += order.shipping_address.city # add the city
city_len = order.shipping_address.city.length # get the length to calculate the needed white space
no_spaces = 30 - city_len
no_spaces.times do
line6 += " "
end
line6 += order.shipping_address.province_code # add the province code
line6 += order.shipping_address.zip # add the zip/postal code
f.write (line6+"\n") # end of line 6
# begin line 7 (this line repeats per line item)
line_no = 0 # create a line counter
order.line_items.each do |line_item|
line_no = line_no + 1 # increment the line number
line7 = "850 PO108300000" # standard way to start the line
line7 += line_no.to_s # add the line number to the line
no_spaces = 20 - line_no.to_s.length # calculate the number of spaces to append
no_spaces.times do
line7 += " "
end
no_zeroes = 16 - line_item.quantity.to_s.length # prepend the quantity with zeroes
no_zeroes.times do
line7 += "0"
end
line7 += line_item.quantity.to_s # add the quantity to the line
line7 += "EA" # standard symbols
price = '%.2f' % line_item.price # get the price formatted ##.##
price_len = price.to_s.length - 1 # figure out how many chars the price is - the decimal
price.to_s =~ /([0-9]+)\.([0-9]{2})/ # convert the price to a string and break it up
dollars = $1 # get the dollar amount from the regex
cents = $2 # get the cents amount from the regex
no_zeroes = 17 - price_len # calculate the number of zeroes to place after the 2 / before the price
line7 += "2" # 2 denotes the position of the decimal in the price
no_zeroes.times do
line7 += "0" # add the zeroes in the middle
end
line7 += dollars # add the dollar amount
line7 += cents # add the cent amount
line7 += " PI" # standard symbols
line7 += line_item.sku.to_s # add the SKU
no_spaces = 48 - line_item.sku.to_s.length # calculate the number of spaces needed
no_spaces.times do
line7 += " "
end
line7 += "VN" # standard symbols
line7 += line_item.sku.to_s # add the SKU again
f.write (line7+"\n")
end # end of the line item
# begin line 8
line8 = "850 CTT204"
no_zeroes = 12 - line_no.to_s.length
no_zeroes.times do
line8 += "0"
end
line8 += line_no.to_s
f.write(line8+"\n")
# begin line 9
line9 = "850 AMT20500000TT 2000000000000058151"
f.write(line9+"\n")
end # end of the order
} # closing the file
@time_created = Time.now
end # end of create method
end
错误报告:
Started POST "/reports" for 127.0.0.1 at 2011-08-09 02:40:17 -0400
Processing by ReportsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"fCQw3Pegyv069jO0tZ4eY5buslyAM/r8yrG7phyoJqI=", "id"=>"20110805", "commit"=>"Create"}
Completed 500 Internal Server Error in 9ms
NoMethodError (undefined method `path' for nil:NilClass):
app/models/report.rb:35:in `create'
app/models/report.rb:10:in `initialize'
app/controllers/reports_controller.rb:8:in `new'
app/controllers/reports_controller.rb:8:in `create'
是这样吗
@file_path = REPORT_DIR+"/#{@date}-orders.txt"
您可能缺少日期的@符号
您还可以尝试使用提供的方法访问中午和午夜
@date.midnight
@date.midnight + 12.hours # or is it - 12.hours ?
我发现了问题。由于应用程序在shopify应用程序的框架内工作,报表控制器需要一个额外的方法来确保用户在向API发出请求之前经过身份验证。非常感谢每个人的参与。如果没有你的帮助,我将一事无成,谢谢你帮我推理。另一个猜测 您正在以
yyyyymmdd hh:mm
格式向Shopify API传递日期,但请求以yyyy-mm-dd hh:mm
格式发送日期
还要注意,您的
date\u格式类变量对您的实例方法不可见(建议将其设置为常量)。您可以发布报表控制器吗?@Devin M感谢您的查看,我添加了它。您在哪里定义报表目录?它的代码是什么样子的?@Devin M甚至将report dir行更改为:file_path=“#{report_dir}/#{date}-orders.txt”相同problem@Bnjmn这很酷,但现在的问题是错误消息与您发布的代码不匹配。请检查app/models/report.rb:35
是否调用了@orders=shopifiapi::Order.find…
。如果是,我建议插入一些logger.debug
消息,以便您可以检查是否正在传递您认为是的值。实际上,我不知道这如何解决您的错误,但可能是问题的一部分。我看不到path在任何地方被呼叫。如果可能的话,你能告诉我们哪一行是35吗?第35行:orders=shopifigapi::Order.find(:all,:params=>{:created_at_min=>“{date}00:00”,:created_at_max=>“{date 23:59”,:Order=>“created_at DESC”…Ruby比这更宽容。不是真的date
和@date
是两个不同的变量。不确定它是否能解决您的问题,但我添加了更多建议,我仍然不知道导致错误的调用路径是什么。如果错误发生变化,请更新我们。非常好的评论,谢谢Rob。这两种方法都得到了实施,并且起到了帮助作用。