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

时间:2014-05-27 01:25:56

标签: ruby-on-rails ruby ruby-on-rails-4

问题:此实施是否存在安全风险或其他问题?我之所以这样做是因为我不想为每个表单输入键入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

<%= form_for @user, url: {action: :create} do |f| %>
  <% @fields.map do |field| %>
    <li>
      <%= f.label field %>

    <% if field =~ /password/ %>
      <%= f.password_field field %>
    </li>

    <% else %>
      <%= f.text_field field %>
    </li>
    <% end %>
  <% end %>
  <%= f.submit "Create Your Account" %>
<% end %>

1 个答案:

答案 0 :(得分:1)

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

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

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

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