Ruby on rails 在这种情况下使用send()是一种好的做法吗?
我有一个应用程序布局,其中包含一个链接,供登录用户编辑其配置文件。最初是这样的:Ruby on rails 在这种情况下使用send()是一种好的做法吗?,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我有一个应用程序布局,其中包含一个链接,供登录用户编辑其配置文件。最初是这样的: <%= link_to "Settings", edit_user_path(current_user) %> 但后来我需要不同类型的用户,我最终得到了以下结果: <%= link_to "Settings", send("edit_#{current_user.type.downcase}_path", current_user) %> Users表上的“type”列用于STI
<%= link_to "Settings", edit_user_path(current_user) %>
但后来我需要不同类型的用户,我最终得到了以下结果:
<%= link_to "Settings", send("edit_#{current_user.type.downcase}_path", current_user) %>
Users表上的“type”列用于STI,在这里我可以神奇地拥有User(Model)类的子类,这对于我来说非常方便
我也有UsersController的子类,因此它是一个给定的类,我将为每种类型提供“编辑路径”
有没有更好的方法,或者我做得很好?URL助手可以在这里完成这项工作:
edit_polymorphic_path(current_user)
我们应该做到这一点。如果您确实发现自己需要使用send
,那么(如果可能)尝试使用public\u send
。顾名思义,这将只调用公共方法
作为旁注,type.downcase
不太正确-如果类名是FooBar,那么路由名称将是edit\u foo\u bar\u path
而不是edit\u FooBar\u path
。下划线
拐点更接近您需要的建议就是您需要的
你也可以使用-
。。。尽管很明显,多态路径
更受欢迎
由于您系统的结构,我觉得答案是合适的(这在评论中提到) STI的东西很棒——我在任何地方都看不到我们应该看到的。但是,关于编辑您的配置文件,我认为您不需要每次都更改控制器操作 当然,你可以,如果你知道,那么我想你知道你在做什么 然而,如果是我,我会把它全部保存在
users
控制器中,即使你有不同的路径到达那里。如果需要,您始终可以将功能外推到助手等:
#config/routes.rb
resources :users, only: [:edit, :update], path: "", path_names: {edit: "profile", update: "profile" }
这将生成以下URL:
# GET url.com/profile
# PATCH url.com/profile
现在
这里最重要的是这句话:
编辑他们的个人资料
这是按用户计算的
如果您需要不同的功能,则必须使用单独的控制器,但由于您总是要引导用户访问他们的配置文件,我认为您需要的只是一个控制器
你可以这样做:
#app/models/user.rb
class User < ActiveRecord::Base
def is? is_type
type == is_type
end
end
#app/controllers/users_controller.rb
class UsersController < ApplicationController
def edit
current_user.is?(:admin) ? change_admin : change_user
end
private
change_admin
#logic
end
change_user
#logic
end
end
#app/models/user.rb
类用户
这假设您的用户在功能上非常相似。您确实需要不同的用户去不同的路径吗?每个用户类型是否有不同的控制器?我可能会转到同一用户路径,并让控件有条件地显示不同的编辑字段。有时帮助者帮不上忙。。。您可以使用实际路径<代码>“/url/for/#{current_user.type.downcase}/#{current_user.id}”。。。。我的意思是,出于对代码维护的充分尊重,Rails是来帮助我们的,而不是让事情变得更复杂…@是的,我可能最终会让用户拥有很多不同的控件,所以单独的控制器似乎比条件(加起来)更安全。哇,太棒了!这两种方法我都不知道。谢谢大家!^_^我曾考虑使用单个UsersController,但最终我的用户类型在设计上完全不同(除了更新配置文件)。将来还可能添加更多的用户类型,这似乎可以通过继承而不是条件更方便地完成。无论如何,如果我在问题中提供了有限的背景,了解更有经验的人会做些什么是很有价值的。谢谢你的建议^_^可以如果它们有那么大的不同,你确定它们与STI一起工作吗?它们实际上是一种特殊的情况(至少是现有的两个子类用户),它们拥有所有相同的列和引用,唯一的区别在于它们如何编辑数据。这是一种“服务器”和“客户端”都可以引用某种“产品”的东西,它们对这种“产品”有完全不同的控制类型。哦,很好,像管理员/用户类型的功能?我们也有这样的功能-我们使用名称空间来分隔这些内容-您的评估答案不正确-看起来正确-您不希望成为当前用户(最终会得到一个字符串,如#
#app/models/user.rb
class User < ActiveRecord::Base
def is? is_type
type == is_type
end
end
#app/controllers/users_controller.rb
class UsersController < ApplicationController
def edit
current_user.is?(:admin) ? change_admin : change_user
end
private
change_admin
#logic
end
change_user
#logic
end
end