Ruby on rails 如何使控制器中的两个def更新版本正常工作?

Ruby on rails 如何使控制器中的两个def更新版本正常工作?,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,如何使控制器中的两个def更新版本正常工作 我有一个表单,管理员应该被允许编辑比普通用户更多的变量。两者都使用相同的编辑视图。目前,我在控制器中有一个表单和def update,可以工作,但不区分管理员和非管理员 现在,我向控制器添加了两个不同的strong_params版本。但是如何根据用户类型应用这些不同的版本呢 一种工作方式是用if-else语句重写def-update,如果是管理员,则使用一个强参数版本;如果是非管理员,则使用另一个强参数版本。然而,这里的问题是,我不能在这个def更新上

如何使控制器中的两个def更新版本正常工作

我有一个表单,管理员应该被允许编辑比普通用户更多的变量。两者都使用相同的编辑视图。目前,我在控制器中有一个表单和
def update
,可以工作,但不区分管理员和非管理员

现在,我向控制器添加了两个不同的strong_params版本。但是如何根据用户类型应用这些不同的版本呢

一种工作方式是用if-else语句重写def-update,如果是管理员,则使用一个强参数版本;如果是非管理员,则使用另一个强参数版本。然而,这里的问题是,我不能在这个def更新上调用before_操作来测试它是否是管理员。出于安全原因,这可能是必要的

因此,我认为我需要在控制器中使用两种不同的def更新方法:1用于调用一个版本的强参数的管理员,并为其添加before_操作。另一个用于具有另一个版本的强参数(以及不同的before_操作)的非管理员


我知道如何在控制器中构建此功能,但不知道如何在编辑视图中告诉表单要使用哪个def更新(或者是否应在控制器中的def编辑中指定此功能?)。(事实上,我甚至不知道Rails如何知道它应该调用def update(可能是通过参考资料:routes中的用户?)。在这种情况下,我是否应该编辑我建议使用的
。表单是表示模型的特殊抽象层。这是php框架的术语(如Zend等)。在我的项目中,我通常称之为“类型”。例如:

型号:

class Post < ActiveRecord::Base

  validates :body, presence: true
  validates :title, presence: true

end

在我看来,这确实是一个很好的实践,也是在相同情况下的最佳体系结构。

我建议在这种情况下使用表单。表单是表示模型的特殊抽象层。这是php框架的术语(如Zend等)。在我的项目中,我通常称之为“类型”。例如:

型号:

class Post < ActiveRecord::Base

  validates :body, presence: true
  validates :title, presence: true

end

在我看来,这确实是一个很好的实践,也是在相同情况下的最佳体系结构。

的表单只能发送到一个控制器操作。因此,您将需要form_for发送到的第三个操作,并让该操作首先确定您是否是管理员/非管理员,然后相应地将您发送到两个“def update methods”中的任何一个(使用参数)。例如,(这完全是伪代码)


的表单_只能发送到一个控制器操作。因此,您将需要form_for发送到的第三个操作,并让该操作首先确定您是否是管理员/非管理员,然后相应地将您发送到两个“def update methods”中的任何一个(使用参数)。例如,(这完全是伪代码)


您可以使用强参数gem,它只允许某些属性。因此,您可以编写一些与

if current_user.admin?
  params.require(:user).allow :name, :role
else
  params.require(:user).allow :name
end
因此,如果您是管理员用户,您可以更改用户的角色,否则,您只能编辑名称

如果您希望普通用户只能编辑其帐户,请签出gem。这更有意义,对吧?如果您是普通用户,则只应更新您的帐户

使用cancancan的示例代码:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    if user.admin?
      can :manage, :all
    else
      can :manage, User, id: user.id
    end
  end
end
如果您使用带有强参数的rails 4,请不要忘记


如果您需要更多详细信息,请告诉我。

您可以使用强参数gem,它只允许某些属性。因此,您可以编写一些与

if current_user.admin?
  params.require(:user).allow :name, :role
else
  params.require(:user).allow :name
end
因此,如果您是管理员用户,您可以更改用户的角色,否则,您只能编辑名称

如果您希望普通用户只能编辑其帐户,请签出gem。这更有意义,对吧?如果您是普通用户,则只应更新您的帐户

使用cancancan的示例代码:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    if user.admin?
      can :manage, :all
    else
      can :manage, User, id: user.id
    end
  end
end
如果您使用带有强参数的rails 4,请不要忘记


如果您需要更多详细信息,请告诉我。

我的解决方案将有两个独立的模型,一个用于
用户
,另一个用于用户所拥有的
角色。在某些情况下,您可能拥有比普通用户和管理员更多的类,因此从长远来看,这种方法简化了添加更多角色的过程

如何做到这一点:

  • 创建
    角色
    模型,该模型有一列为
    名称
  • 用户
    模型将有一个
    has\u和\u属于\u多个:角色
    关系
  • 角色
    模型将有一个
    has\u和\u属于\u many:users
    关系
  • 由于多对多关系,您应该创建一个联接表。联接表应按字母数字顺序以模型命名。因此,您的迁移应该如下所示
    rails g migration CreateRolesUsersTable
  • 有_和_属于_许多
    语句创建自动使用联接表查找其值的变量。你可以看看这些
  • 您可以通过以下方式检查设置是否正确:

    admin\u role=role.find\u by(名称:“admin”)
    用户角色。包括?(管理员角色)

  • 您还可以将自己的方法添加到
    用户
    模型中供自己使用。这是我的一个例子:

    
    def管理员?
    self.u角色是否由名称命名?(“管理员”)
    结束

    def添加_角色(角色)
    角色我的解决方案将有两个独立的模型,一个用于
    用户
    ,另一个用于用户拥有的
    角色
    。在某些情况下,您可能拥有比普通用户和管理员更多的类,因此从长远来看,这种方法简化了添加更多角色的过程

    如何做到这一点:

  • 创建
    角色
    模型,该模型有一列为
    名称
  • 用户
    模型将有一个
    has\u和\u属于\u多个:角色
    关系
  • 角色
    模型将有一个
    has\u和\u属于\u many:users
    关系
  • 因为
    
    def admin?
        self.is_role_by_name?("admin")
    end 

    def add_role(role) roles << role end

    def add_role_by_name(role_name) role = Role.find_by(name: role_name) add_role(role) end

    def remove_role(role) roles.delete(role) end

    def remove_role_by_name(role_name) role = Role.find_by(name: role_name) remove_role(role) end

    def is_role?(role) roles.to_a.include?(role) end

    def is_role_by_name?(role_name) role = Role.find_by(name: role_name) is_role?(role) end
    <% if @user.admin? %>
       input whatever here...
    <% end %>