【问题标题】:undefined method `upcase' for #<Task:0x007f91f6442390>#<Task:0x007f91f6442390> 的未定义方法“大写”
【发布时间】:2015-08-24 12:52:52
【问题描述】:

当我从我的 js 文件发送 post 请求时

$http.post('/users/:user_id/tasks/', {id: $scope.task.id, title: data});

在我的控制器中创建操作,我收到以下错误。

带参数

什么意思?

控制器

  def create
    respond_to current_user.tasks.create(task_params)
  end

  private

  def task_params
    params.require(:task).permit(:id, :title, :due_date, :priority, :complete)
  end

rake 路线

         user_tasks GET    /users/:user_id/tasks(.:format)          tasks#index
                    POST   /users/:user_id/tasks(.:format)          tasks#create
      new_user_task GET    /users/:user_id/tasks/new(.:format)      tasks#new
     edit_user_task GET    /users/:user_id/tasks/:id/edit(.:format) tasks#edit
          user_task GET    /users/:user_id/tasks/:id(.:format)      tasks#show
                    PATCH  /users/:user_id/tasks/:id(.:format)      tasks#update
                    PUT    /users/:user_id/tasks/:id(.:format)      tasks#update
                    DELETE /users/:user_id/tasks/:id(.:format)      tasks#destroy

rails 控制台日志

Started POST "/users/:user_id/tasks/" for 127.0.0.1 at 2015-08-24 15:46:23 +0300
Processing by TasksController#create as HTML
  Parameters: {"id"=>1, "title"=>"some text", "user_id"=>":user_id", "task"=>{"id"=>1, "title"=>"some text"}}
  User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 1]]
   (0.2ms)  begin transaction
   (0.1ms)  commit transaction
Completed 500 Internal Server Error in 11ms (ActiveRecord: 0.8ms)

NoMethodError (undefined method `upcase' for #<Task:0x007f91f513a4c8>):
  app/controllers/tasks_controller.rb:22:in `create'


  Rendered /home/alex/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.3/lib/action_dispatch/middleware/templates/rescues/_source.erb (9.9ms)
  Rendered /home/alex/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.3/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (4.4ms)
  Rendered /home/alex/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.3/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.6ms)
  Rendered /home/alex/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.3/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (39.4ms)
Cannot render console with content type application/jsonAllowed content types: [#<Mime::Type:0x00000003c77a60 @synonyms=["application/xhtml+xml"], @symbol=:html, @string="text/html">, #<Mime::Type:0x00000003c57cb0 @synonyms=[], @symbol=:text, @string="text/plain">, #<Mime::Type:0x00000003c4b960 @synonyms=[], @symbol=:url_encoded_form, @string="application/x-www-form-urlencoded">]

【问题讨论】:

  • 你也可以给我们看一下rails控制台日志吗?很高兴看到这个异常的长堆栈跟踪
  • 我怀疑堆栈跟踪会将您指向一个回调,该回调正在执行类似于 foo = self.upcase 的操作,而它需要是 foo = self.title.upcase 或类似的操作。
  • @MaxWilliams 遗憾的是,它只指向控制器文件。
  • @ArupRakshit 堆栈跟踪仅包含一条路由app/controllers/tasks_controller.rb:22:in create
  • @BillyLogan 你能在 rails 控制台试试同样的方法吗……看看有没有错误……

标签: javascript ruby-on-rails angularjs ruby-on-rails-4 controller


【解决方案1】:

我之前没见过这种语法

def create
  respond_to current_user.tasks.create(task_params)
end

通常是这样的

def create
  if current_user.tasks.create(task_params)
    @created = true
  end
  respond_to do |format|
    format.html #will do default which is render :action => "create"
  end
end

我认为这可能是你的问题:respond_to 正在传递一个它不期望的 Task 对象,我猜想调用 upcase 传递的内容是它正常行为的一部分。

编辑 是不是应该是respond_with 而不是respond_to

http://apidock.com/rails/ActionController/MimeResponds/respond_with

【讨论】:

  • 同意,似乎respond_to 需要mimes 并且它调用了一个名为Collector 的类并将哑剧大写。这可能是原因。 github.com/rails/rails/blob/…
  • @BillyLogan 因为您发布了另一个问题,基本上重申了这个问题,但使用我的解决方案stackoverflow.com/questions/32206401/…,也许您应该将我的答案标记为正确?
  • 就我而言,编辑是正确的。当我打算使用respond_with时,我使用的是respond_to
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
相关资源
最近更新 更多