使用常量在控制器中存储列名称以存储参数?

问题:此实施是否存在安全风险或其他问题? 我这样做的原因是因为我不想为每个表单输入键入f.text_field :field_name 。 这似乎是最干的方法。 主要关注点 :常量是否未得到执行,并且想知道这种实现是否存在安全风险?

 class UserController < ApplicationController def index end def new @user = User.new @fields = USER_FIELDS end def create render text: params.inspect end private USER_FIELDS = ["first_name", "last_name", "email", "password"] def require_parmas params.require(:user).permit(USER_FIELDS) end end 

用户#new view

   
  • 您可能希望冻结常量,以便任何其他代码都无法更改该值。 这应该满足您的安全问题。

     USER_FIELDS = ["first_name", "last_name", "email", "password"].freeze 

    否则,这是一种公平的方法。 我唯一不同的是我将USER_FIELDS常量移动到User模型,因为这更像是在“业务逻辑”域中。 然后继续直接访问常量,而不是@fields它存储在@fields实例变量中。 (另外,如果您采用这种方法,或者您将无法访问它,请不要将常量标记为私有。)

     <% User::USER_FIELDS.each do |field| %> # ... <% end %>