Ruby on rails 我怎样才能提高我的;“新名称”;方法

Ruby on rails 我怎样才能提高我的;“新名称”;方法,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,我是一名学生,我收到了一份备忘录(没有解释) 我下面的代码有缺陷,可以做得更好。您将如何改进我的控制器#newname方法?谢谢你抽出时间 class ReviewController < ApplicationController def index @reviews = Review.all.order(created_at: :desc) end def newname @review = Review.find(param

我是一名学生,我收到了一份备忘录(没有解释) 我下面的代码有缺陷,可以做得更好。您将如何改进我的
控制器#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
class ReviewController
最大的缺陷是
update\u attribute
跳过所有验证,因此很少/永远不会执行else语句。将其更改为:

@review.name = sanitize(params[:title])
if @review.save
  #...

而且应该更好。

我想你也许可以做一些类似的事情:

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
<代码>类修订控件sanitize(参数[:title])) 呈现json:@review 其他的 render:json=>{errors:@review.errors.full_messages},状态:422 结束 结束 结束 这样做的目的是保持“在轨道上”,让公约为你做工作

这是针对

  • 状态码
  • 用于更新的方法
  • 错误

根据布罗伊萨泽的回答,我肯定会使用save而不是update\u属性。我还将返回发生的错误,以便用户可以解析或显示它们。如果您在Rails 4上,请使用(在controller中的私有方法中声明)

轨道3: 轨道4
class ReviewController{:errors=>@review.errors.full_messages},:status=>422
结束
结束
私有的
def set_审查
@review=review.find(参数[:id])
结束
def review_参数
参数要求(:审查)。许可证(:标题)
结束
结束

reviewname方法在哪里?@locoboy抱歉,我是说newname方法第一步是将
newname
方法重命名为
update
。这将更符合REST最佳实践,而不是有一个不直观的自定义路线。我投票将这个问题作为离题来结束,因为这是一个明确的代码审查请求。我们有一个SE站点用于代码审查。要完成回答:代码500是为机器错误保留的,如果资源没有更新,您应该使用422
 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
  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