Ruby on rails 将参数集合从控制器传递到模型会破坏MVC吗?
我想将params集合从控制器传递到模型,以解析过滤和排序条件。模型中有一个从控制器获取参数的方法会破坏MVC吗?我不相信,但我无论如何都不是rails的老手。通常,params散列在控制器中使用,该操作可能读取和写入模型信息,也可能不读取和写入模型信息,因此我猜如果params要通过属于该模型的方法,这将是相同的事情Ruby on rails 将参数集合从控制器传递到模型会破坏MVC吗?,ruby-on-rails,model-view-controller,Ruby On Rails,Model View Controller,我想将params集合从控制器传递到模型,以解析过滤和排序条件。模型中有一个从控制器获取参数的方法会破坏MVC吗?我不相信,但我无论如何都不是rails的老手。通常,params散列在控制器中使用,该操作可能读取和写入模型信息,也可能不读取和写入模型信息,因此我猜如果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]' />