新手问题 同一个 URL 根据设定表现出不同的业务逻辑

thxagain · 2016年02月25日 · 最后由 thxagain 回复于 2016年02月25日 · 2199 次阅读
def sample_method
end

我现在有这么一个需求,实现一个 api server: 用户访问的 url 是同一个:host/sample_method, 但是需要根据用户的设定,表现出不同的业务逻辑。

我想了一个办法: 首先提供给用户一个类似设定参数的接口:host/setting?status=1 在访问host/sample_method之前实现访问这个设定参数的接口设定下需要表现出的业务逻辑, 把参数保存在一个全局变量中,然后修改代码:

def sample_method
  case 全局变量
  when 1
    逻辑1
  when 2
    逻辑2
  end
end

现在遇到的问题是:

  1. 实现方案有没有可以改进的地方?【用户访问的 url 已经是固定的了,不能变动】
  2. 全局变量存哪里呢?当前的 api server 没有数据库,存内存中,用$开头的全局变量么?

在你“逻辑 1”,“逻辑 2”的位置 render 不同的模板

例如,我有 Issue Model

class Issue < ActiveRecord::Base
  enum status: [:submitted, :rejected, :done]
end

issues_controller.rb

class IssuesController < ApplicatioController
  def show
    @issue = Issue.find(params[:id])
  end
end

issues/show.html.erb

<%= render @issue.status %>
  • issues/_submitted.html.erb
  • issues/_rejected.html.erb
  • issues/_done.html.erb

然后在各自不同的局部模板上面实现具体内容

你把status放在服务器的全局变量里,那一个用户改了,不就会影响其他用户吗?这是你要的效果吗?

@huacnlee 谢谢,可是我既没有 model 层也没有 view 层,是一个非常简单的 api mock server 工程,用来配合做测试的。

@u1440247613 那可能要看 status 存放在哪里了,如果存放在 session 中【不知道可不可行...】,那应该就不会影响到其他用户了,因为 session 默认是存放在客户端的。如果存放在服务器端的一个文件或内存中,那是会影响到其他用户的。不过当前只有 1 个用户~

#3 楼 @thxagain 全局变量存一个字典就好了,key 用 sessionid,另外 rails 的默认方案,session 存在 cookie 里的,这个特性你也可以利用下

@jasl 尝试了一下用 session 存储,默认是存 cookie 中,结果由于项目连前端 view 层都没有,用 postman 调接口测试,在第一个 action 中存储到了 session 中,到另外一个 action 中要取出来时告诉我:

#<ActionDispatch::Request::Session:0x7fe558031480 not yet loaded>

我现在想:要不直接调用第一个 action 时写到服务器端的一个文件中,第二个 action 中把这个文件中的值取出来,似乎也可行... 【更新:似乎用@@开头的变量就可以了😄

#5 楼 @thxagain 一般来说 API 环境下的用户识别是通过 Token 来解决的,请求时放到 HTTP Header 里,一些不安全的做法是追加到 uri 里比如 mysite.com/me?token=xxx ,不知道你们的项目这这块如何设计的 如果有,那么你直接把这个 Token 当做 SessionID 或者别管啥 Session 啦,就理解成开全局变量 Hash key 用 token 就好了

@jasl 谢谢,最后也是用类变量@@status解决的,由于只有 1 个用户(也就是测试程序😂),连 hash 结构都没用,直接在第一个 action 中根据 post 请求传过来的参数赋值给@@status

在第二个 action 中取出@@status就好。

感觉挺傻的方法~

需要 登录 后方可回复, 如果你还没有账号请 注册新账号