【问题标题】:How to validate data from a controller in a model?如何验证模型中控制器的数据?
【发布时间】:2013-01-15 00:27:55
【问题描述】:

我的控制器中有从另一个 Rails 应用程序和数据库接收的数据(必须在控制器中)我想获取这些数据,以便我可以在我的模型中验证它之前允许在向导中执行另一个步骤(有关一些代码示例,请参阅 my other question

我的问题是我无法直接从模型中的控制器获取这些数据,因为这违反了 MVC。

我的问题是如何检查我的模型中的控制器数据?

  • 我是否必须在视图中加载此数据/真 - 假响应,然后将其链接到我的模型? (我真的不希望它显示在视图中,并且还没有完全弄清楚如何做到这一点)

  • 我是否需要将此数据传递给路由,即example/data.json,然后在我的模型中检查它? (我还没有弄清楚如何在我的模型中使用这个 data.json)

任何朝着正确方向的帮助/指导都会非常有用。 (我也不能使用 gem 来做到这一点

【问题讨论】:

  • 来自请求的信息是否转换为对象的“状态”?如果是这样,您可以在对象上设置状态,然后使用它在模型中进行验证。通常控制器中与请求、时间、会话、参数等相关的内容应该保留在那里。与模型相关的事情应该在模型上进行。你能更新对象并在模型上设置有效的状态信息吗?
  • 数据进来然后我基本上想检查数据是否存在我可以让控制器在其方法中返回true/false,但它必须存在于控制器中。然后我想从控制器获得这个响应并用它来验证我的模型。您对如何做到这一点有任何想法吗?

标签: ruby-on-rails ruby model-view-controller


【解决方案1】:

首先,请确保您不会通过模型本身不包含的数据来验证模型。模型应该验证它的当前状态,但不是它进入这个状态的方式(例如,哪个用户将模型置于这个状态)。

其次,你不应该在模型中使用控制器方法。如果控制器包含一些业务逻辑,则将该逻辑提取到第三个类中,供控制器和模型使用。

此外,您在控制器中有数据并且可以访问模型,对吗?因此,如果您在控制器方法中,例如在过滤器或操作之前,您可以获取该数据并将其传递给模型,如下所示:

def controller method
  hey_model.is_this_correct?(data)
end

如果您说必须在控制器响应请求后检查该数据(例如,在下一个向导步骤,即在下一个请求时),那么您肯定必须存储该值请求之间的某处。

这正是无状态 HTTP 的重点。在您明确执行此操作之前,不会在请求之间保存任何数据。您可以将值存储在 cookie 或数据库中。

【讨论】:

  • 数据来自另一个 Rails 应用程序数据库(从控制器发出请求)此控制器必须包含此数据请求方法,它不能去任何其他地方。模型验证将是这样的 validate :data_presence, if => lambda { |0| 0.current_step == "step1" } def data_presence #check controller data exists or true / false response etc end 数据来自数据库,我想不再存储它,尽管如果我需要将它放置在 step1 视图或可接受的路线上你有什么建议吗?
  • 建议 #1。更改向导的逻辑(不是一件容易的事)。建议#2。将当前步骤暂时保存在模型的表格中(它闻起来) 建议 #3。将该数据保存在 cookie/session 中或将其传递给下一步表单,并使其将该数据插入到下一个请求中。
  • 顺便说一句,|0| 0.current_step
  • 抱歉,我应该是 o 而不是 0,我会看看我能做些什么,谢谢您的帮助。
  • 这是我真正想要的答案,虽然我有其他人回答了另一个问题,但有一些很好的方法可以实现这一点,感谢您的帮助。
【解决方案2】:

我知道这个问题是不久前的问题,但对于那些仍在搜索的人,我找到了确切的答案,即如何将信息从控制器传递到模型。

有了这条线,一切都解决了

var = request.env['target_model'].sudo().function_in_your_model(data) 

var 是一个变量,以防您需要在控制器中处理该数据,target_model 是您要发送数据的模型,function_in_your_model 是您要处理数据的函数在模型中,在这个函数中你发送你需要的数据。

【讨论】:

    猜你喜欢
    • 2012-12-27
    • 2013-10-12
    • 2012-04-02
    • 1970-01-01
    • 2012-03-21
    • 2012-11-17
    • 2011-08-04
    • 1970-01-01
    • 2015-08-12
    相关资源
    最近更新 更多