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)
您需要创建所需的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)
这将使您能够achievements在User您拥有的任何对象上调用该方法.
错误
您所遇到的错误描述如下:
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)
| 归档时间: |
|
| 查看次数: |
21247 次 |
| 最近记录: |