Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.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 将参数集合从控制器传递到模型会破坏MVC吗?_Ruby On Rails_Model View Controller - Fatal编程技术网

Ruby on rails 将参数集合从控制器传递到模型会破坏MVC吗?

Ruby on rails 将参数集合从控制器传递到模型会破坏MVC吗?,ruby-on-rails,model-view-controller,Ruby On Rails,Model View Controller,我想将params集合从控制器传递到模型,以解析过滤和排序条件。模型中有一个从控制器获取参数的方法会破坏MVC吗?我不相信,但我无论如何都不是rails的老手。通常,params散列在控制器中使用,该操作可能读取和写入模型信息,也可能不读取和写入模型信息,因此我猜如果params要通过属于该模型的方法,这将是相同的事情 无论哪种方式,我认为您仍然需要通过控制器发送参数,因此为什么不在那里进行处理,然后通过模型的方法将处理后的数据发送到模型?我想肯定是这样 params散列有很多模型不需要的东西。

我想将params集合从控制器传递到模型,以解析过滤和排序条件。模型中有一个从控制器获取参数的方法会破坏MVC吗?

我不相信,但我无论如何都不是rails的老手。通常,params散列在控制器中使用,该操作可能读取和写入模型信息,也可能不读取和写入模型信息,因此我猜如果params要通过属于该模型的方法,这将是相同的事情


无论哪种方式,我认为您仍然需要通过控制器发送参数,因此为什么不在那里进行处理,然后通过模型的方法将处理后的数据发送到模型?

我想肯定是这样


params散列有很多模型不需要的东西。基本上你忽略了MVC的C部分。您想做的事情将起作用(即它将执行),但我认为您应该将参数作为单独的实体传入。

这取决于具体情况。您正在向模型传递一个散列数据,并说“理解它”

类模型
这没关系。但你可能会发现自己想通过许多不同的行动来实现这一点。在每种情况下,您不可能使参数完全相同,因此您需要在模型上使用多个方法,每个操作一个:

class Model < ActiveRecord::Base
  def update_from_update_params(params)
    # do stuff
  end

  def update_from_settings_params(params)
    # do different stuff
  end

end

class ModelsController < ActionController::Base
  def update
    ...
    @model.update_from_update_params(params)
  end

  def change_settings
    ...
    @model.update_from_settings_params(params)
  end
end
类模型
这不正常,您正在使模型执行控制器工作。合理的折衷办法是在模型上创建一个接受规范数据散列的方法,然后在控制器中的参数和规范散列之间进行转换:

class Model < ActiveRecord::Base
  def update_from_data(hash)
    validate_data!(hash)
    # do stuff
  end
end

class ModelsController < ActionController::Base
  def update
    ...
    @model.update_from_data(translate_update_params)
  end

  def change_settings
    ...
    @model.update_from_data(translate_change_settings_params)
  end
end
# in controller
def search
  Model.search(params[:search][:options])
end
类模型
尽管您应该确保仔细记录模型接受的数据散列的格式。实际上,我们甚至使用YAML验证库()来确保模型只接受有效数据


很抱歉回答得太长,但我没有时间写一个较短的;)

我建议传递参数的子集,这样您只传递模型需要的内容

在控制器中:

class Model < ActiveRecord::Base
  def update_from_data(hash)
    validate_data!(hash)
    # do stuff
  end
end

class ModelsController < ActionController::Base
  def update
    ...
    @model.update_from_data(translate_update_params)
  end

  def change_settings
    ...
    @model.update_from_data(translate_change_settings_params)
  end
end
# in controller
def search
  Model.search(params[:search][:options])
end
只需确保您的输入具有“名称空间”,以便获得嵌套哈希:

<!-- in view -->
<input type='text' name='search[options][keywords]' />
<input type='text' name='search[options][conditions]' />
<input type='text' name='search[options][sort]' />