【问题标题】:undefined local variable or method `params' for main:Objectmain:Object 的未定义局部变量或方法“参数”
【发布时间】:2014-04-21 17:02:54
【问题描述】:

我有一个 rake 任务,我正在尝试在数据库中查找要更新的记录。问题是当我使用 (params[:name]) 时,它会抛出消息 undefined local variable or method `params' for main:Object。如何使参数可用于 rake 任务?谢谢。我是新手,感谢您提供任何帮助。

task scrape_borisAPI: :environment do

@json = HTTParty.get("http://borisapi.heroku.com/stations.json")

@json.each do |station|

@location = Location.find(params[:name])
    @location.nb_bikes = station["nb_bikes"]
    @location.nb_empty_docks = station["nb_empty_docks"]
    @location.update_attributes(:nb_bikes => "@location.nb_bikes", :nb_empty_docks => "@location.nb_empty_docks")
end
end

最初 rake 任务看起来像这样,我正在尝试修改它以更新记录,而不是创建新记录。

task scrape_borisAPI: :environment do

@json = HTTParty.get("http://borisapi.heroku.com/stations.json")

@json.each do |station|
        @location = Location.new
    @location.name = station["name"]
    @location.latitude = station["lat"]
    @location.longitude = station["long"]
    @location.nb_bikes = station["nb_bikes"]
    @location.nb_empty_docks = station["nb_empty_docks"]
    @location.save!
    end
end

【问题讨论】:

  • 您的意思是您希望能够将参数传递给 rake 任务以在其中使用它们?或者,您想在 Rails 中使用请求中的params
  • 我本质上希望数据库中每条记录的名称都可用于 rake 任务?那有意义吗?谢谢
  • 我了解您想要做什么,但不了解您想如何完成它。您对params[:name] 的期望究竟是什么。 params 只是 Rails 请求上下文中的一个方法。您不会在 Rake 任务中找到 params。如果您想要将参数传递给 Rake 任务,那是另一回事。你了解什么是 Rake 任务吗?
  • 我想我知道,但现在我可能会怀疑自己!我已经编辑了原始问题,也许这有帮助?我正在尝试在数据库中查找现有记录,然后对其进行更新。我不知道传入参数是否是我想要的,我只需要 rake 能够查看数据库,如果它找到了记录匹配名称,更新它

标签: ruby-on-rails scrape rake-task


【解决方案1】:

你不能。 Rake 任务不是 Web 请求,只有 Web 请求有 params。 怎么做?使用ENV

task scrape_borisAPI: :environment do

unless ENV['name']
  puts "You should set ENV 'name' to something to perform this task!"
  next # Use next, see this Stackoverflow question: http://stackoverflow.com/questions/2316475/how-do-i-return-early-from-a-rake-task
end

@json = HTTParty.get("http://borisapi.heroku.com/stations.json")

@json.each do |station|

@location = Location.find(ENV['name'])
    @location.nb_bikes = station["nb_bikes"]
    @location.nb_empty_docks = station["nb_empty_docks"]
    @location.update_attributes(:nb_bikes => "@location.nb_bikes", :nb_empty_docks => "@location.nb_empty_docks")
end
end

然后你可以这样运行你的任务:

bundle exec rake scrape_borisAPI name=Something

【讨论】:

  • 感谢您的帮助,但我不知道该怎么做。
  • 什么意思?我写了整个代码,甚至是 bash 命令,你不需要其他任何东西
  • 我的意思是它没有做任何事情......我试图编辑它,因为它不起作用。对不起。
  • 那是你的代码,你应该让它工作,我只是复制粘贴你在你的问题中写的内容。我只添加了 正在工作的 ENV['name'] 东西,我让它在我编写的数千个任务中工作,所以没什么特别的(它也是非常简单的代码,很难创建错误)。如果您的 API 抓取代码不起作用,您应该自己检查它,但这不是这个问题的重点。
【解决方案2】:

由于您将从代码中调用 rake 任务,因此您可以编写一个接收参数的 rake 任务。

namespace :whatever do desc "desc of task" task :task_name, [:arg1] => :environment do |task, args| puts "Your argument is #{arg.arg1}" #Do all that you want. end end

你可以写下你对 rake 任务的描述,然后用你想要的参数调用它,你可以进行更新操作。调用任务就像:rake whatever:taskname[argument]

【讨论】:

  • 感谢您的帮助,但我不知道该怎么做。
  • @jamesarobbo 你能给出你调用 rake 任务的代码吗?
猜你喜欢
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多