render避免双重渲染错误

大多数 Rails 开发者迟早都会看到一个错误消息:Can only render or redirect once per action(动作只能渲染或重定向一次)。这个提示很烦人,也很容易修正。出现这个错误的原因是,没有理解 render 的工作原理。

例如,下面的代码会导致这个错误:

def show
   @book = Book.find(params[ :id ])
   if @book .special?
     render action: "special_show"
   end
   render action: "regular_show"
end

如果 @book.special? 的结果是 true,Rails 开始渲染,把 @book 变量导入 special_show 视图中。但是,show 动作并不会就此停止运行,当 Rails 运行到动作的末尾时,会渲染 regular_show视图,导致错误出现。解决的办法很简单,确保在一次代码运行路线中只调用一次 render 或 redirect_to 方法。有一个语句可以提供帮助,那就是 and return。下面的代码对上述代码做了修改:

def show
   @book = Book.find(params[ :id ])
   if @book .special?
     render action: "special_show" and return
   end
   render action: "regular_show"
end

千万别用 && return 代替 and return,因为 Ruby 语言操作符优先级的关系,&& return 根本不起作用。

注意,ActionController 能检测到是否显式调用了 render 方法,所以下面这段代码不会出错:

def show
   @book = Book.find(params[ :id ])
   if @book .special?
     render action: "special_show"
   end
end

如果 @book.special? 的结果是 true,会渲染 special_show 视图,否则就渲染默认的 show 模板。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值