Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在这种情况下使用send()是一种好的做法吗?_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

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