Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 带触发器的嵌套表单_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 带触发器的嵌套表单

Ruby on rails 带触发器的嵌套表单,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我正在尝试用几个业务规则构建一个产品配置器。 我有两种型号,一种是产品,另一种是组件。一个产品有很多组成部分,但是 相同的成分可用于不同的产品 我有模型和关系等,并试图在product controller中构建我的show视图 def show @product = Product.find(params[:id]) @productelements = Product.find(params[:id]).elements end --内部控制器 def show @product = P

我正在尝试用几个业务规则构建一个产品配置器。 我有两种型号,一种是产品,另一种是组件。一个产品有很多组成部分,但是 相同的成分可用于不同的产品

我有模型和关系等,并试图在product controller中构建我的show视图

def show
@product = Product.find(params[:id])
@productelements = Product.find(params[:id]).elements
end 
--内部控制器

def show
@product = Product.find(params[:id])
@productelements = Product.find(params[:id]).elements
end 
--鉴于

用户可以将处理器更改为处理器B,但在这种情况下,HDD的数量需要更改为1。这只是为了说明

所以我想知道如何: -将此元素循环包装成一个表单。 -使表单响应更改并调用一个函数,该函数将在需要时进行验证和调整。 -使用已验证的字段呈现产品

你能给我什么建议吗?或者这种方法根本不现实? 请注意,有许多产品和许多规则,所以我不想在控制器中使用case语句,因为它会拖数英里


谢谢

好的,首先要稍微更正上面的代码,您需要搜索两次相同的产品。执行以下操作,而不是执行第一个代码块:

def show
  @product = Product.find(params[:id])
  @productelements = @product.elements
end
如您所见,我已经替换了第二个find()调用

现在谈谈你更大的问题,我认为你想得太多了。如果有绑定到组件的业务规则,请将这些规则表达在卡在lib/目录中的模块中,并将该模块混合到产品模型中。通过这种方式,您将能够在表单上下文之外测试业务规则,以确保您的操作正确

然后,您可以使用所述测试规则作为表单上的自定义验证。因此,在您的示例中,如果用户将CPU A更改为CPU B,但留下的HDD数量不正确,则后端验证将捕获并标记此数据

然后,您可以通过ajax将此验证公开到前端,以获得更流畅的UI,但每次只需一件事


有道理吗?

有道理,非常感谢!我有点担心下面的问题,我不一定希望用户在硬盘上输入所需的数量,而是根据更改调整自己的任何字段。因此,我知道实现这一点的唯一方法是通过javascript使用表单中的标记。但是,这又让我所有的配置规则都暴露给任何能看到页面源代码的人。是否仍然可以使表单在更改时调用一个操作,然后再次渲染,但这次不查询数据库?否则,我将得到相同的默认视图?因为您的业务规则将存在于模块中,而不是数据库中,所以您可以轻松地进行ajax调用,根据刚刚离开的字段的值调整值。这样,它就不在客户端,您也不必查询数据库。谢谢您的回答。你有没有什么好的资源可以推荐,看看如何做到这一点?我指的是对模块方法和结果的ajax调用?不是真的,但应该不会太难。将验证规则视为一种资源。例如,您可以创建一个validations控制器,该控制器的使用方式与任何其他控制器相同。此控制器中的操作将调用您的模块,而不是ActiveRecord模型。
def show
  @product = Product.find(params[:id])
  @productelements = @product.elements
end