Rails未定义的方法

dai*_*isy 4 controller ruby-on-rails undefined

为什么这个未定义?它与它有关@current_user吗?

我正在努力为我的挑战创造任务.创建的任务应该获得/成就.但是,我收到了GET 500错误.

这是我得到的错误:

NoMethodError at /achievements
==============================

> undefined method `achievements' for #<User:0x00000105140dd8>

app/controllers/achievements_controller.rb, line 5
--------------------------------------------------

``` ruby
    1   class AchievementsController < ApplicationController
    2   
    3   
    4     def index
>   5       @achievements = @current_user.achievements
    6       render :json => @achievements
    7     end
    8   
    9     def new    10       @achievement = Achievement.new
Run Code Online (Sandbox Code Playgroud)

这是我控制器中的代码

class AchievementsController < ApplicationController


  def index
    @achievements = @current_user.achievements
    render :json => @achievements
  end

  def new
    @achievement = Achievement.new
    render :json => @achievement
  end

  #create a new achievment and add it to the current user
  #check then set the acheivments pub challenge id to the current pub challenge
  def create
    @achievement = Achievement.new achievement_params
    @achievement.user = @current_user.id
    @achievement.pub_challenge = params[:id]
    if @achievement.save
      # render :json => @achievement #{ status: 'ok'}
    else
      render :json => {:errors => @achievement.errors}
    end
  end

  def show
    @achievement = Achievement.find params[:id]
    render :json => @achievement

  end

  def destroy
    @achievement = Achievement.find params[:id]
    @achievement.destroy
  end

  private
    def achievement_params
    params.require(:achievement).permit(:pub_challenges)
    end


end
Run Code Online (Sandbox Code Playgroud)

小智 7

您缺少has_many :achievementsUser模型中的关系.


Ric*_*eck 6

您需要创建所需的ActiveRecord关联:

#app/models/user.rb
class User < ActiveRecord::Base
   has_many :achievements
end

#app/models/achievement.rb
class Achievement < ActiveRecord::Base
   belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

这将使您能够achievementsUser您拥有的任何对象上调用该方法.


错误

您所遇到的错误描述如下:

undefined method `achievements' for #<User:0x00000105140dd8>
Run Code Online (Sandbox Code Playgroud)

这基本上意味着您尝试在User对象上调用未定义的方法.可能听起来很简单,但实际上,大多数人都不理解它.

要正确解释,你必须记住,Rails由于构建在Ruby上而是面向对象的.这意味着你在Rails 中所做的一切都应该围绕对象构建 - 这些对象在你的Models:

在此输入图像描述

这意味着每次调用一个对象时,你实际上都会调用一系列"方法",这些方法可以让你能够操纵对象本身,或者它拥有的任何相关功能.

您遇到的问题是您的User对象没有该achievements方法.虽然您可以简单地执行以下操作来解决问题,因为它是Rails,您需要使用关联数据填充记录:

#app/models/user.rb
class User < ActiveRecord::Base
   has_many :achievements #-> what you need

   def achievements
      #this will also fix the error you see, although it's fundamentally incorrect
   end
end
Run Code Online (Sandbox Code Playgroud)