gpt4 book ai didi

ruby-on-rails - Controller 最佳实践 : Multiple Methods or Multiple cases in Show

转载 作者:数据小太阳 更新时间:2023-10-29 08:24:57 27 4
gpt4 key购买 nike

我经常在需要多种方法的地方构建 Controller (除了索引、编辑、显示等)。大多数时候我的 Action desire 可以归为 show 因为它们是简单的 GET 操作,但是我不想在任何一个 Controller 操作中加入太多逻辑。

这是实现相同目标的两种不同方法的简单示例事情...

class TwitterFriendController < ApplicationController
## lump everything into show?
def show
if params[:id] == "follow"
users = current_user.following
elsif params[:id] == "follow_me"
users = current_user.users_who_follow_me
elsif params[:id] == "following_follow_me"
users = current_user.following_who_follow_me
elsif params[:id] == "following_who_do_not_follow_me"
users = current_user.following_who_do_not_follow_me
...
end
respond_with do |format|
format.json do {...}
end
end

## or split everything out into separate methods, this requires
additional routing
def following
...
end

def users_who_follow_me
...
end

def following_who_follow_me
...
end

def following_who_do_not_follow_me
...
end
end

一应俱全

  • 一种方法中的大量逻辑
  • 干吗? # 逻辑需要大量额外代码
  • 减少路由

分离方法

  • 更多路由
  • 不干
  • 简单的方法查找
  • 更易于阅读各个方法

因此,真正的问题又是,哪些技术较少不好。

最佳答案

我会做类似的事情:

FOLLOW_WHITELIST = %w[ follow follow_me following_follow_me following_who_follow_me following_who_do_not_follow_me ]

def show
if FOLLOW_WHITELIST.include? params[:id]
users = current_user.send params[:id].to_sym
end
respond_with do |format|
format.json do {...}
end
end

这将调用在 params[:id] 中传递的任何方法,只要它在白名单中(以防止任意代码注入(inject))。

如果有单独的路由对您有利(更好的 url?),您还可以使用如下方式动态生成方法和路由:

class TwitterFriendController < ApplicationController

FOLLOW_ACTIONS = %w[ follow follow_me following_follow_me following_who_follow_me following_who_do_not_follow_me ]

FOLLOW_ACTIONS.each do |action|
define_method action do
users = current_user.send action.to_sym
respond_with do |format|
format.json do {...}
end
end
end

end

然后在routes.rb中:

FOLLOW_ACTIONS.each do |action|
match action.to_sym => "controller##{action}"
end

关于ruby-on-rails - Controller 最佳实践 : Multiple Methods or Multiple cases in Show,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5955098/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com