Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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 仅允许某些用户使用的强参数和变量背后的基本原理_Ruby On Rails_Ruby On Rails 4_Strong Parameters - Fatal编程技术网

Ruby on rails 仅允许某些用户使用的强参数和变量背后的基本原理

Ruby on rails 仅允许某些用户使用的强参数和变量背后的基本原理,ruby-on-rails,ruby-on-rails-4,strong-parameters,Ruby On Rails,Ruby On Rails 4,Strong Parameters,我很难理解坚强的情妇。我知道这会阻止你不允许的大量变量赋值。但在Hartl的文章中,我也读到,如果没有强参数,有人可以通过补丁请求改变任何用户的管理员状态,我猜这不是大规模分配,因为这只是你会改变的一个值。但是,如何为以下变量实现强参数: 仅允许在创建新用户时设置一次 一些用户应该能够更改,但其他用户不能 例如,我有: private def user_params params.require(:user).permit(:email,

我很难理解坚强的情妇。我知道这会阻止你不允许的大量变量赋值。但在Hartl的文章中,我也读到,如果没有强参数,有人可以通过补丁请求改变任何用户的管理员状态,我猜这不是大规模分配,因为这只是你会改变的一个值。但是,如何为以下变量实现强参数:

仅允许在创建新用户时设置一次 一些用户应该能够更改,但其他用户不能 例如,我有:

  private
    def user_params
      params.require(:user).permit(:email,
                                   :username,
                                  #:verified,
                                  #:admin,
                                  #:moderator,
                                  #:activated, 
                                  #:activated_at, 
                                   :password, 
                                   :password_confirmation)
    end
现在,我知道带破折号的不应该被允许。否则,用户可以通过批量分配或其他方式更改其值

然而:

作为同一表/控制器的特定用户的管理员用户应该能够为所有用户更改这些变量。 对于我的应用程序,不同表的组织应该能够授予用户版主权限,从而为用户更改这些值。 只有在创建新用户时才应设置用户名,并且在创建新用户之后不应允许更改用户名。现在,通过在强参数中允许用户名,这不意味着它很容易通过批量分配进行更改吗?
强参数与这些问题有什么关系?

我不是专家,但据我所知:设置强参数时,通常是控制传递到更新属性/创建方法的内容。因此,您定义的是在其中生存的内容:

params[:user][ ... ]
在管理员更新用户的情况下,您不需要发布整个用户对象,您只需调用特定的函数,该函数将更改您想要更改的任何用户属性。换言之:

$.ajax(
  { "method": "PUT", "url": "/users/" + uid },
  { "task": "make_admin" }
);
在控制器中:

def update
  if params[:task] == "make_admin" && user_is_authorized
    User.find(params[:id]).admin = true
  end
end

而最简单的情况是用户参数总是做同样的事情,并被所有调用用来更新属性,这只是最简单的情况

根据当前用户的权限进行许可,或者为不同的操作提供不同的许可列表,这是非常明智的,因此可能只有创建操作许可中使用的许可列表:username


您可以考虑的另一个模式是具有管理员访问权限的管理员命名空间:Admin::UsRsSube将允许更多的字段发生突变,并且可能暴露出普通用户不能访问的更多功能或数据。

我从来没有处理过这个问题,但根据我的经验,我的观点是:用户参数可以有一个条件来检查当前用户权限,并根据该条件设置允许的属性。至于更改用户名,我会在模型中进行管理,或者有一个新的_user _params。这样就可以保存在控制器中定义一个带有if语句的def edit,如果它是admin,那么它将基于不同的强参数设置@users,否则将使用第二个更严格的强参数版本。也就是说,不需要定义两个不同的def编辑,这可以通过if-else语句来完成?@Nick原则上听起来不错