【问题标题】:Rails 3 forms and modelsRails 3 形式和模型
【发布时间】:2011-03-18 15:33:24
【问题描述】:

我来自 Asp.Net MVC 世界,我很困惑如何从模型角度处理 Rails 3 表单。 在 Asp.Net MVC 中,绑定到模板中的业务模型表单是一种不好的做法。正确的方法是为每个表单创建一个类,创建仅在表单中需要的属性并将验证属性附加到它们。然后在代码中检查 ModelState.IsValid 并将值从表单模型分配给业务模型。这会导致概念分离并防止属性劫持(当黑客可能将附加值与适当的值一起发布并以他残忍的方式更改业务模型属性时)。

从我读过的所有教程和书籍中,Rails 世界中没有分离出这个概念 - 您将验证放入您的业务模型中,并将您的模型绑定到模板中的表单。

这是 Rails 3 中的正确方法吗?我应该遵循它吗?或者我应该遵循 Asp .Net MVC 方法并为表单创建一个单独的带有验证的模型?

【问题讨论】:

    标签: ruby-on-rails-3 forms model


    【解决方案1】:

    在 Rails 中,模型的更新通常通过mass-assignment 进行。例如,一个表单向您的更新操作发布大量属性,您的更新操作调用:

    Model.update_attributes(params[:model])
    

    并且传递的哈希中的所有值都会在模型上更新。那么问题是如果黑客添加了会发生什么

    params[:model][:users_attributes][:email] = 'hacker@example.com'` 
    

    并更新模型的关联用户的电子邮件地址?

    在 Asp.Net MVC 中,您似乎根本不允许在表单模板中这样做,并且值永远无法到达您的模型,但在 Rails 中,这不是事情的完成方式(如果我误解了,请纠正我ASP.NET MVC)。在 Rails 中,模型中的所有内容(默认情况下)都可以批量分配,因此您有理由担心。

    在我提供的链接中,您可以看到“例如,对于普通用户帐户,您只希望用户可以编辑登录名和密码。不应该通过批量分配来更改状态属性。”

    class User < ActiveRecord::Base
      attr_accessible :login, :password
    end
    

    这意味着必须手动设置任何其他属性并保存对象,从而防止与 Asp.Net 的表单模板所防止的相同类型的属性劫持。在 Rails 中,任何应该可以批量分配的东西都应该在你的attr_accessible 中,然后 ActiveRecord 就是看门人。无论您的表单是如何编写的,或者黑客对他们的 HTML 做了什么,这些属性只能由您的代码显式更新,而不是 Rails 的幕后东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 2012-05-23
      相关资源
      最近更新 更多