Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >带有before_filter的Rails3.2引擎怪异之处

带有before_filter的Rails3.2引擎怪异之处
EN

Stack Overflow用户
提问于 2012-07-12 10:02:24
回答 1查看 941关注 0票数 0

我有一个Rails 3.2.6应用程序,它需要你登录才能使用它。它还有一个安装在/api上的Rails引擎,它为某些部分提供了JSON API,而不需要身份验证。

当我启动Rails服务器并发出以下请求时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /api/something
GET /
GET /api/something

一切都按预期运行,API请求按预期返回JSON,主页呈现html页面。

奇怪的是。如果我在启动Rails服务器后立即按此顺序发出请求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /
GET /api/something
GET /api/something

则API请求失败。来自根Rails应用程序的before过滤器为应用程序接口引擎触发,导致重定向到在应用程序接口引擎中不存在的UserSessionsController#new,并失败。如果首先向API引擎而不是根Rails应用程序发出请求,则API引擎不会在筛选器之前继承。对这种怪异现象的任何解释都将是很好的:)

虽然我现在的计划是把API引擎变成一个完全独立的Rack应用程序。似乎在这一点上它是一个引擎的唯一原因是因为在我之前的人真的很喜欢引擎。

EN

回答 1

Stack Overflow用户

发布于 2012-07-12 19:25:07

经过一大堆挖掘,我找到了问题所在。是引擎本身造成的。我应该指出的是,我并不负责项目的创建,只是负责处理它。

假设我们的主机Rails应用程序具有...

app/controllers/application_controller.rb

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ApplicationController < ActionController::Base
  before_filter :foo_bar
  layout :application
end

我们的引擎被称为api_engine,并被隔离在ApiEngine模块下,并且具有...

app/controllers/api_engine/application_controller.rb

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module ApiEngine
  class ApplicationController < ActionController::Base
    layout false
  end
end

app/controllers/api_engine/post_controller.rb

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module ApiEngine
  class PostController < ApplicationController
    # code goes here...
  end
end

你已经明白我要说什么了吗?问题是Rails的动态加载和愚蠢的引擎结构的组合。

当向服务器发出的第一个请求是对引擎的PostController的请求时,需要post_controller.rb文件,该文件会遇到ApiEngine模块中的ApplicationController常量。但是::ApiEngine::ApplicationController没有定义,所以它会检查::ApplicationController是不是,这会导致在引擎中寻找application_controller.rb

但是,如果第一个请求发送到主机应用程序,最终定义ApplicationController,当引擎收到请求时,它只会从根应用程序使用ApplicationController,而不需要它自己的类版本。

解决方案相当简单,在引擎的lib/api_engine/engine.rb文件中,需要config.after_initialize块中的正确应用程序控制器文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module ApiEngine
  class Engine < Rails::Engine
    isolate_namespace ApiEngine
    config.after_initialize do
      require "api_engine/application_controller"
    end
  end
end

这是一个有点棘手的跟踪,特别是处理别人的代码,你倾向于假设某些“基本”的事情是按他们应该的方式工作的。如果其他任何人发现自己处于类似的奇怪情况,希望这个答案可能会有用:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11449464

复制
相关文章
怪异的排序
咋一看,不就是先按姓名做排序,然后再分别对班组、机台号做排序么。按这个思路写出了 SQL(表结构及数据在文末),得到的结果和预期的有点不一样。
白日梦想家
2020/11/03
3630
hive weekofyear 怪异的姿势
今天在使用hive函数weekofyear的时候遇到一个奇怪的情况,原sql如下:
大数据工程师-公子
2019/03/14
7850
【面试说】怪异的 JavaScript
在网上看到一个有趣的测试,访问地址 [1]。里面包含了 25 道选择题,每个都是一个简单的表达式,然后让你选择,都是一些 JavaScript 怪异行为的体现,最后网站生成答案和解析,帮助你更好的理解 JavaScript 怪异的行为。
GopalFeng
2022/08/01
3370
搞懂 parseInt() 的怪异行为
parseInt()是内置的 JS 函数,用于解析数字字符串中的整数。 例如,解析数字字符串'100':
前端小智@大迁世界
2022/03/22
1.1K0
SpingBoot的独特之处
Spring Boot 的开启注解是:@SpringBootApplication,其实它就是由下面三个注解组成的:
葆宁
2019/04/18
3950
函数的强大之处
接着上讲的游戏,我们可以用任何数字,10, 42, 10 亿,假设每关结束后 给玩家一些奖励分,奖励分多少取决于 继电器剩余数量。随着难度增加,剩下继电器会越来越难,因此奖励分会根据当前关卡数,指数级增长。我们要写一小段代码来算指数,指数是一个数乘自己,乘特定次数。用循环来实现简直完美!
硬核编程
2019/08/19
3510
Python中的id()函数_怪异现象
那么,id(obj)和id(obj)是不是相等的呢?让我们来测试一下(Python3.7)
py3study
2020/01/13
7150
Docker的局限之处
Docker,一个新的容器技术,它能够在相同的旧服务器上运行的更多的应用程序,这也使得它很容易打包和发布程序。它可以得到相同的硬件上比其他技术运行更多的应用(小的开销内存/ CPU/硬盘,这意味着更低成本);它使开发人员能够快速创建简单的,现成的运行容器化应用;它使管理和部署应用程序更加容易。但docker在使用中也面临着诸多问题,以下将为大家列出docker的缺点 一、网络限制 容器网络(Docker Network )让你可以方便地在同一主机下对容器进行网络连接。加上一些其他的工作,你就可以跨主机使用叠
小小科
2018/05/04
1.2K0
Python的杂点之处
Python中is 与 == 区别: is 用于判断两个变量引用对象是否为同一个(同一块内存空间), == 用于判断引用变量的值是否相等。和iOS 中的 isEqual 与 == 类似。
可定
2021/04/25
3020
前端科普文:为什么&lt;!DOCTYPE&gt; 不可或缺
When question comes 你一定在 HTML 页面最前面看到过这样一行代码(比如 百度): <!DOCTYPE html> 或者说类似这样的(比如 博客园-韩子迟 PS:博客园首页 文档类型声明同百度): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 那么问题来了。 这行代码有什么用? 去掉它会有什
前朝楚水
2018/04/04
9270
【说站】css怪异盒模型的介绍
1、怪异盒设置的width/height不仅包含了content盒子内容的宽度/高度,还包含了padding和border的宽度/高度。
很酷的站长
2022/11/24
2550
16 个怪异的代码注释,想用的拿走
「逆锋起笔」专注程序员综合发展,分享Java、Python、编程技术资讯、职业生涯、行业动态的互联网平台,实现技术与信息共享,关注即送全网最新视频教程。
逆锋起笔
2020/03/03
4130
16 个怪异的代码注释,想用的拿走
关于Relay的麻烦之处
直接在render里进行setState会导致组件无限循环渲染,当然把queryrender取缔掉用fetch替换可以解决,但是怎么在使用relay的同时直接setState呢?
从今若
2019/09/19
7700
GraphQL 优势之处
举个例子,Book对象有bookTypeId,那我想看对应的bookTypeName,bookType对应的summary咋办? 如果你用RESTful Api ,免不了要定制接口或者多次调用后端。 现在用上GraphQL,就是这么无情:
从今若
2019/09/19
6080
小程序容器的神奇之处
首先比较关键明显的问题就是,自身开发的APP活跃度不高。甚至有可能都比不上小程序开发的APP。究其背后,这个问题产生的原因其实是,随着用户数量及需求的不断拓展,自有 App 业务种类有限,很难及时满足存量用户的持续活跃需要,导致 App 的活跃度持续低下,如何更进一步服务客户、实现更多业务场景突破,是摆在各个 App 面前亟待解决的难题。
用户10236691
2022/12/15
3870
小程序容器的神奇之处
Excel中6个怪异的公式,你知多少?
文 | 兰色幻想-赵志东 在excel中我们有时会看到一些奇奇怪怪的公式,为了帮助新手学习,兰色今天带大家一起盘点这些公式。 公式1:=Sum(表1:表20!A1) 揭密:这是Sum的多表求和公式 用
CDA数据分析师
2018/02/24
2.5K0
Excel中6个怪异的公式,你知多少?
tidymodels之parsnip的强大之处
工作流是tidymodels中非常重要的概念,它可以把模型设定和预处理步骤(在tidymodels中称为配方)连接起来,成为一个整体的对象。
医学和生信笔记
2023/09/26
2710
tidymodels之parsnip的强大之处
Angular中environments的神奇之处
例如: 比如environment.prod.ts对应的就是prod环境,你有多少个环境这里就新建多少个文件。(当然没有的就是默认的运行环境)
易兒善
2018/08/21
1.9K0
Angular中environments的神奇之处
Datawallet的与众不同之处
很多人会问“Datawallet到底是什么,它与那些宣称要为我的数据提供托管服务并创建市场的公司有什么不同?”这篇文章就解答了这些疑惑。这些公司运行的共同点在于他们开发的是基于许可的数据交换(PBDE)。最近这个行业令人兴奋之处在于验证了数据钱包Datawallet多年来一直关注的焦点——让您的数据为您工作。 但是,在C2B数据供应生态系统中, Datawallet究竟是如何在众多新进入者中脱颖而出的呢?这篇文章将回答这个问题。
区块链领域
2018/07/23
3510
Datawallet的与众不同之处
SpingBoot的独特之处:自动配置
Spring Boot 的开启注解是:@SpringBootApplication,其实它就是由下面三个注解组成的:
葆宁
2022/05/06
3240

相似问题

Google认证的怪异之处

13

mongoengine ReferenceField的怪异之处

12

Exchange 2010 powershell怪异之处

12

更多的Ajax / MVC怪异之处

44

C#事件的怪异之处

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文