Rails未定义方法

问题描述:

为什么这个未定义?它与@current_user有什么关系?Rails未定义方法

我正在尝试为我的挑战创建任务。创建的任务应该获得/成就。但是,我收到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 

这是我的代码在我的控制器

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 
+2

请向我们展示您的用户模型的相关部分。 – 2014-09-01 05:12:13

你缺少你的用户模型中的has_many :achievements关系。

你需要创建ActiveRecord associations您需要:

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

#app/models/achievement.rb 
class Achievement < ActiveRecord::Base 
    belongs_to :user 
end 

这会给你打电话的achievements方法对您有任何User对象的能力。


错误

你已经被描述为这样的错误:

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

这基本上意味着你要调用一个User对象的一个​​未定义的方法。可能听起来很简单,但实际上,大多数人都不理解它。

为了正确解释,您必须记住,由于构建在Ruby上的Rails是object orientated。这意味着,一切你在做的Rails应围绕物体的结构 - 这是在您的Models定义:

enter image description here

这意味着每次调用对象,你实际上是以上调用一系列“方法”,这些方法将使您能够操作对象本身或其任何相关功能。

您遇到的问题是您的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 

东西帮我这种类型的错误是,数据库表是错过了相关的专栏。将所需列添加到数据库解决了问题。