问题:此实施是否存在安全风险或其他问题?我之所以这样做是因为我不想为每个表单输入键入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 %>
答案 0 :(得分:1)
您可能希望冻结常量,以便任何其他代码都无法更改该值。这应该满足您的安全问题。
USER_FIELDS = ["first_name", "last_name", "email", "password"].freeze
否则,这是一种公平的方法。我唯一不同的是我将USER_FIELDS
常量移动到 User 模型,因为这更像是在“业务逻辑”域中。然后继续直接访问常量,而不是首先将其存储在@fields
实例变量中。 (另外,如果您采用这种方法,或者您将无法访问它,请不要将常量标记为私有。)
<% User::USER_FIELDS.each do |field| %>
# ...
<% end %>