我是一名学生,我得到了备忘录(没有解释)我下面的代码有bug,可以做得更好。你如何改进我的controller#newname
方法?感谢您的宝贵时间!
class ReviewController < ApplicationController
def index
@reviews = Review.all.order(created_at: :desc)
end
def newname
@review = Review.find(params[:id])
if @review.update_attribute(:title, sanitize(params[:title]))
format.json { render json: { status: 200 } }
else
format.json { render json: { status: 500 } }
end
end
end
最大的缺陷是update_attribute
跳过所有的验证,因此,您的else语句很少或永远不会被执行。改为:
@review.name = sanitize(params[:title])
if @review.save
#...
以BroiSatse的回答为基础,我肯定会使用save而不是update_attribute。我还将返回发生的错误,以便用户可以解析或显示它们。如果你在Rails 4上,使用强参数(在控制器的私有方法中声明)
Rails 3: def newname
@review = Review.find(params[:id])
@review.title = sanitize(params[:title])
if @review.save
format.json { render json: { status: 200 } }
else
render :json => {:errors => @review.errors.full_messages}, :status => 422
end
end
Rails 4 class ReviewController < ApplicationController
before_action :set_review, only [:newname] #list additional methods as needed...
...
def newname
#@review is retrieved from set_review
if @review.update(review_params)
format.json { render json: { status: 200 } }
else
render :json => {:errors => @review.errors.full_messages}, :status => 422
end
end
private
def set_review
@review = Review.find(params[:id])
end
def review_params
params.require(:review).permit(:title)
end
end
我想你也许可以这样做:
class ReviewController < ApplicationController
def index
@reviews = Review.all.order(created_at: :desc)
end
def newname
@review = Review.find(params[:id])
if @review.update(:title => sanitize(params[:title]))
render json: @review
else
render :json => { errors: @review.errors.full_messages }, status: 422
end
end
end
这个想法是保持"在轨道上",让惯例为你工作。
指向
- <
- 状态代码/gh>
- 方法用于更新 <
- 错误/gh>