Rails 5及5.1.5 Passenger环境中before_filter未定义问题求助
解决Rails 5中Mobylette的
undefined method 'before_filter'错误 这个问题的核心原因很清晰:Rails 5.0及以上版本已经废弃了before_filter方法,统一改用before_action,而你使用的Mobylette gem版本还在依赖旧的before_filter语法——当你在app/controllers/application_controller.rb里执行include Mobylette::RespondToMobileRequests时,就触发了这个兼容性错误。
下面给你几个可行的解决办法:
升级Mobylette到兼容Rails 5的版本
首先确认Mobylette的最新版本是否适配了Rails 5。在你的Gemfile里更新gem的版本声明,比如:gem 'mobylette', '~> 5.0' # 可通过本地运行`gem search mobylette`查看最新兼容版本号然后执行
bundle update mobylette完成升级,重启服务器后问题应该就能解决。手动打补丁修复兼容性
如果暂时没有兼容Rails 5的Mobylette版本,你可以通过猴子补丁替换模块里的before_filter调用。在项目中新建初始化文件config/initializers/mobylette_patch.rb,写入以下代码:module Mobylette module RespondToMobileRequests def self.included(base) base.extend ClassMethods base.send(:include, InstanceMethods) # 将原有的before_filter替换为Rails 5支持的before_action base.before_action :set_mobile_format end end end保存后重启服务器,这个补丁会覆盖Mobylette原有的模块代码,解决方法名不兼容的问题。
临时替代方案(不推荐)
如果你不想修改gem或打补丁,也可以暂时移除Mobylette的include,手动在ApplicationController里实现移动端请求处理逻辑,比如:class ApplicationController < ActionController::Base before_action :set_mobile_format private def set_mobile_format # 复制Mobylette的移动端判断逻辑 request.format = :mobile if request.mobile? end end不过这种方法需要你自己维护移动端的判断逻辑,不如前两种方法省心。
内容的提问来源于stack exchange,提问作者uberdave
相关产品推荐
相关产品推荐

