Ruby on rails 为什么我必须在我的Show动作中包含@link=link.find(params[:id])?
我正在制作reddit的一个模型,在这个模型中,我以一个表单提交url和标题,然后数据库应该被填充,我们应该被带到一个展示页面,以查看我们提交的链接和标题 我的问题是为什么我必须在我的控制器中包含这个Ruby on rails 为什么我必须在我的Show动作中包含@link=link.find(params[:id])?,ruby-on-rails,controller,scaffolding,Ruby On Rails,Controller,Scaffolding,我正在制作reddit的一个模型,在这个模型中,我以一个表单提交url和标题,然后数据库应该被填充,我们应该被带到一个展示页面,以查看我们提交的链接和标题 我的问题是为什么我必须在我的控制器中包含这个 def show @link = Link.find(params[:id]) end 如果我删除@link=link.find(params[:id])我的显示不起作用 我得到以下错误: NoMethodError in Links#show 在这条线上 <%= @
def show
@link = Link.find(params[:id])
end
如果我删除@link=link.find(params[:id])
我的显示不起作用
我得到以下错误:
NoMethodError in Links#show
在这条线上
<%= @link.title %>
我正在与另一个项目进行比较,在这个项目中,我为类似的东西生成了一个scaffold,我只有私有方法,不需要在我的show action中使用@link=link.find(params[:id])
这是我的完整控制器代码:
class LinksController < ApplicationController
def index
@link = Link.all
end
def new
@link = Link.new
end
def create
@link = Link.new(link_params)
respond_to do |format|
if @link.save
format.html { redirect_to @link, notice: 'Link was successfully created.' }
format.json { render action: 'show', status: :created, location: @link }
else
format.html { render action: 'new' }
format.json { render json: @link.errors, status: :unprocessable_entity }
end
end
end
def show
@link = Link.find(params[:id])
end
private
def set_link
@link = Link.find(params[:id])
end
def link_params
params.require(:link).permit(:title, :url)
end
end
类链接控制器
这是我生成的脚手架的完整控制器:
class HighScoresController < ApplicationController
before_action :set_high_score, only: [:show, :edit, :update, :destroy]
# GET /high_scores
# GET /high_scores.json
def index
@high_scores = HighScore.all
end
# GET /high_scores/1
# GET /high_scores/1.json
def show
end
# GET /high_scores/new
def new
@high_score = HighScore.new
end
# GET /high_scores/1/edit
def edit
end
# POST /high_scores
# POST /high_scores.json
def create
@high_score = HighScore.new(high_score_params)
respond_to do |format|
if @high_score.save
format.html { redirect_to @high_score, notice: 'High score was successfully created.' }
format.json { render action: 'show', status: :created, location: @high_score }
else
format.html { render action: 'new' }
format.json { render json: @high_score.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /high_scores/1
# PATCH/PUT /high_scores/1.json
def update
respond_to do |format|
if @high_score.update(high_score_params)
format.html { redirect_to @high_score, notice: 'High score was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @high_score.errors, status: :unprocessable_entity }
end
end
end
# DELETE /high_scores/1
# DELETE /high_scores/1.json
def destroy
@high_score.destroy
respond_to do |format|
format.html { redirect_to high_scores_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_high_score
@high_score = HighScore.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def high_score_params
params.require(:high_score).permit(:game, :score)
end
end
class HighScoresController < ApplicationController
before_action :set_high_score, only: [:show, :edit, :update, :destroy]
class HighScoresController
为什么生成的脚手架在我的show action中没有
@link=link.find(params[:id])
,而我自己的项目却没有?您缺少生成的脚手架的控制器类中的第一行:
class HighScoresController < ApplicationController
before_action :set_high_score, only: [:show, :edit, :update, :destroy]
# GET /high_scores
# GET /high_scores.json
def index
@high_scores = HighScore.all
end
# GET /high_scores/1
# GET /high_scores/1.json
def show
end
# GET /high_scores/new
def new
@high_score = HighScore.new
end
# GET /high_scores/1/edit
def edit
end
# POST /high_scores
# POST /high_scores.json
def create
@high_score = HighScore.new(high_score_params)
respond_to do |format|
if @high_score.save
format.html { redirect_to @high_score, notice: 'High score was successfully created.' }
format.json { render action: 'show', status: :created, location: @high_score }
else
format.html { render action: 'new' }
format.json { render json: @high_score.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /high_scores/1
# PATCH/PUT /high_scores/1.json
def update
respond_to do |format|
if @high_score.update(high_score_params)
format.html { redirect_to @high_score, notice: 'High score was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @high_score.errors, status: :unprocessable_entity }
end
end
end
# DELETE /high_scores/1
# DELETE /high_scores/1.json
def destroy
@high_score.destroy
respond_to do |format|
format.html { redirect_to high_scores_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_high_score
@high_score = HighScore.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def high_score_params
params.require(:high_score).permit(:game, :score)
end
end
class HighScoresController < ApplicationController
before_action :set_high_score, only: [:show, :edit, :update, :destroy]
在执行
show
操作之前,调用set\u link
函数。您缺少生成的脚手架的控制器类中的第一行:
class HighScoresController < ApplicationController
before_action :set_high_score, only: [:show, :edit, :update, :destroy]
# GET /high_scores
# GET /high_scores.json
def index
@high_scores = HighScore.all
end
# GET /high_scores/1
# GET /high_scores/1.json
def show
end
# GET /high_scores/new
def new
@high_score = HighScore.new
end
# GET /high_scores/1/edit
def edit
end
# POST /high_scores
# POST /high_scores.json
def create
@high_score = HighScore.new(high_score_params)
respond_to do |format|
if @high_score.save
format.html { redirect_to @high_score, notice: 'High score was successfully created.' }
format.json { render action: 'show', status: :created, location: @high_score }
else
format.html { render action: 'new' }
format.json { render json: @high_score.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /high_scores/1
# PATCH/PUT /high_scores/1.json
def update
respond_to do |format|
if @high_score.update(high_score_params)
format.html { redirect_to @high_score, notice: 'High score was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @high_score.errors, status: :unprocessable_entity }
end
end
end
# DELETE /high_scores/1
# DELETE /high_scores/1.json
def destroy
@high_score.destroy
respond_to do |format|
format.html { redirect_to high_scores_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_high_score
@high_score = HighScore.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def high_score_params
params.require(:high_score).permit(:game, :score)
end
end
class HighScoresController < ApplicationController
before_action :set_high_score, only: [:show, :edit, :update, :destroy]
在执行
show
操作之前,调用set\u link
函数。您缺少生成的脚手架的控制器类中的第一行:
class HighScoresController < ApplicationController
before_action :set_high_score, only: [:show, :edit, :update, :destroy]
# GET /high_scores
# GET /high_scores.json
def index
@high_scores = HighScore.all
end
# GET /high_scores/1
# GET /high_scores/1.json
def show
end
# GET /high_scores/new
def new
@high_score = HighScore.new
end
# GET /high_scores/1/edit
def edit
end
# POST /high_scores
# POST /high_scores.json
def create
@high_score = HighScore.new(high_score_params)
respond_to do |format|
if @high_score.save
format.html { redirect_to @high_score, notice: 'High score was successfully created.' }
format.json { render action: 'show', status: :created, location: @high_score }
else
format.html { render action: 'new' }
format.json { render json: @high_score.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /high_scores/1
# PATCH/PUT /high_scores/1.json
def update
respond_to do |format|
if @high_score.update(high_score_params)
format.html { redirect_to @high_score, notice: 'High score was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @high_score.errors, status: :unprocessable_entity }
end
end
end
# DELETE /high_scores/1
# DELETE /high_scores/1.json
def destroy
@high_score.destroy
respond_to do |format|
format.html { redirect_to high_scores_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_high_score
@high_score = HighScore.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def high_score_params
params.require(:high_score).permit(:game, :score)
end
end
class HighScoresController < ApplicationController
before_action :set_high_score, only: [:show, :edit, :update, :destroy]
在执行
show
操作之前,调用set\u link
函数。您缺少生成的脚手架的控制器类中的第一行:
class HighScoresController < ApplicationController
before_action :set_high_score, only: [:show, :edit, :update, :destroy]
# GET /high_scores
# GET /high_scores.json
def index
@high_scores = HighScore.all
end
# GET /high_scores/1
# GET /high_scores/1.json
def show
end
# GET /high_scores/new
def new
@high_score = HighScore.new
end
# GET /high_scores/1/edit
def edit
end
# POST /high_scores
# POST /high_scores.json
def create
@high_score = HighScore.new(high_score_params)
respond_to do |format|
if @high_score.save
format.html { redirect_to @high_score, notice: 'High score was successfully created.' }
format.json { render action: 'show', status: :created, location: @high_score }
else
format.html { render action: 'new' }
format.json { render json: @high_score.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /high_scores/1
# PATCH/PUT /high_scores/1.json
def update
respond_to do |format|
if @high_score.update(high_score_params)
format.html { redirect_to @high_score, notice: 'High score was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @high_score.errors, status: :unprocessable_entity }
end
end
end
# DELETE /high_scores/1
# DELETE /high_scores/1.json
def destroy
@high_score.destroy
respond_to do |format|
format.html { redirect_to high_scores_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_high_score
@high_score = HighScore.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def high_score_params
params.require(:high_score).permit(:game, :score)
end
end
class HighScoresController < ApplicationController
before_action :set_high_score, only: [:show, :edit, :update, :destroy]
在执行
show
操作之前,调用set\u link
函数。您需要将实例变量@link的值设置为
@link = Link.find(params[:id])
在show action中,因为在link
的show
视图中,您将显示特定链接对象(@link)的详细信息,如
并从显示、编辑、更新和销毁
操作(如果有)中删除对@link=link.find(params[:id])
的调用
使用only
选项设置before\u action
将导致在执行所列操作之前调用set\u link
方法
例如:如果您访问某个链接的显示url,则首先会调用set_link,然后调用该显示操作(因为显示操作位于:only列表中)
请注意,HighScoresController
也设置了相同的内容(在\u操作之前:设置\u high\u score
),这就是为什么避免了对@highscore=highscore.find(params[:id]
的冗余调用。您需要将实例变量@link
的值设置为
@link = Link.find(params[:id])
在show action中,因为在link
的show
视图中,您将显示特定链接对象(@link)的详细信息,如
并从显示、编辑、更新和销毁
操作(如果有)中删除对@link=link.find(params[:id])
的调用
使用only
选项设置before\u action
将导致在执行所列操作之前调用set\u link
方法
例如:如果您访问某个链接的显示url,则首先会调用set_link,然后调用该显示操作(因为显示操作位于:only列表中)
注意