【发布时间】:2010-09-26 13:05:29
【问题描述】:
我有一个 Rails 应用程序,它允许用户通过填写扩展表单来构建数据库查询。我想知道在 Rails 中检查表单参数的最佳实践。以前,我有我的results 方法(表单提交的方法)执行以下操作:
if params[:name] && !params[:name].blank?
@name = params[:name]
else
flash[:error] = 'You must give a name'
redirect_to :action => 'index'
return
end
但是对于几个表单字段,看到每个字段都重复这种情况会让人厌烦。我不能将它们全部放在某个循环中以检查每个字段,因为这些字段的设置不同:
- 单键:
params[:name] - 一个键和一个子键:
params[:image][:font_size] - 如果设置了其他字段,则只希望填写某些表单字段
等等。这也是重复的,因为我为每个缺失/无效参数设置了flash[:error],并为每个参数重定向到相同的 URL。我改用before_filter 来检查所有必要的表单参数,只有在一切正常时才返回true。然后我的results 方法继续,变量被完全分配,不涉及检查:
@name = params[:name]
在我的 validate_form 方法中,我有如下代码段:
if (
params[:analysis_type][:to_s] == 'development' ||
params[:results_to_generate].include?('graph')
)
{:graph_type => :to_s, :graph_width => :to_s,
:theme => :to_s}.each do |key, sub_key|
unless params[key] && params[key][sub_key]
flash[:error] = "Cannot leave '#{Inflector.humanize(key)}' blank"
redirect_to(url)
return false
end
end
end
我只是想知道我是否会以最好的方式解决这个问题,或者在参数验证方面我是否遗漏了一些明显的东西。我担心这仍然不是最有效的技术,因为我有几个块在其中为flash[:error] 赋值,然后重定向到相同的 URL,然后返回 false。
编辑澄清:我目前没有在模型中进行此验证的原因有两个:
- 我不是为了在数据库中创建或更新行而尝试从用户那里收集数据。用户提交的所有数据在退出后都不会保存。当他们提交它以搜索数据库并生成一些东西时,它就全部使用了。
- 查询表单接收与多个模型相关的数据,并接收与模型完全不相关的其他数据。例如。上面显示的图形类型和主题不连接到任何模型,它们只是传达有关用户希望如何显示其结果的信息。
编辑以显示改进的技术: 感谢 Jamis Buck 的 Raising the Right Exception article,我现在使用特定于应用程序的异常。例如:
def results
if params[:name] && !params[:name].blank?
@name = params[:name]
else
raise MyApp::MissingFieldError
end
if params[:age] && !params[:age].blank? && params[:age].numeric?
@age = params[:age].to_i
else
raise MyApp::MissingFieldError
end
rescue MyApp::MissingFieldError => err
flash[:error] = "Invalid form submission: #{err.clean_message}"
redirect_to :action => 'index'
end
【问题讨论】:
-
我认为您不必使用 params[:name] 和 !params[:name].blank?在你的条件下。 !params[:name].blank?足够的。 params[:name] 如果为 nil(没有这样的参数)返回 false 并且 params[:name].blank?如果为 nil 或为空,则返回 true。
-
你得到一个 NoMethodError。我可以覆盖 NilClass 来添加#blank?对它,我想。 irb(main):002:0> 参数 = {:a => 1, :b => 2, :c => 3} => {:c=>3, :a=>1, :b=>2 } irb(main):003:0> !params[:name].blank? NoMethodError:未定义的方法“空白?”对于 nil:NilClass from (irb):3
-
这里没有 Ruby,只有 Rails。 已删除标签
标签: ruby-on-rails forms validation