我有一个json Api接收了创建设备的参数,比如 name , imei 等。设备可以有一个黑名单对象({{1} })。我想知道如果在Device的post请求中存在params,那么创建黑名单对象的正确方法是什么。
例如has_one :blacklist
目前代码中我应该
curl -X POST -d api_key=000000 -d device[name]='stack' -d device[blacklist]='true' https://www.example.com/api/devices.json
但我不喜欢那么多:
def create
@device = Device.new
@device.update_attributes(strong_parameters)
if params[:device]['blacklist'] && params[:device]['blacklist'] == true
@blacklist = Blacklist.new(device_id: @device.id)
end
render :device, status: 201 # will render with jbuilder @device and @blacklist
end
呢。这个控制器闻起来像我。
欢迎提供反馈。
@device
答案 0 :(得分:1)
检查ArrayIndexOutOfBoundsException
很好地放在控制器中 - 这就是它的目的 - 模型层不应该知道请求参数。
但您可以使用
将此信息放在瞬态属性中params
然后,您可以为class Device
attr_accessor 'create_blacklisted'
end
模型中的新属性和after_initialize
回调创建输入字段,随后可以创建黑名单条目。
答案 1 :(得分:1)
在conrtoller中有太多的逻辑?否强>
我也听过很多关于控制器中逻辑太多的错误'但这是胡说八道,或者说我认为这些词语不够准确。
该短语对我来说意味着,例如,模型验证不应该在控制器中,并且控制器应该对于非常基本的REST操作保持轻量级。控制器应该只是HTML请求和模型之间的桥梁。可以这样想:您可能有几个控制器修改相同的模型。您将在每个控制器中编写的内容,应该最有可能作为验证在模型中编写。
但是在这里你处理特定的请求(将device[blacklist] == true
转换为黑名单模型并不是什么"自然",所以我认为它应该是控制器。
另外,只有6行的控制器动作不是我们可以称之为"太多逻辑"
验证里面的参数是好的做法?是/否强>
我认为你的意思是在控制器中编写特定的代码行,如if params[xxx] == blabla
或类似的东西
你做的方式很好。您只将特定代码用于特殊参数(黑名单),其余的参数作为强参数进入模型,因此模型验证将完成其余的工作。
仅在参数与此特定控制器相关时验证参数(例如,如果它是基于站点的,您可能使用黑名单的不同实现,因此差异必须在控制器中。< / p>
如果没有给出参数,如何处理请求?我知道强参数应该返回400,但是我刚创建的@device是什么。
这部分我不太喜欢你当前的实现。您无法检查save
操作是否成功。这是您可以编写的内容(检查每个持久性操作结果的结果,并进行适当的渲染)
def create
@device = Device.new
if @device.update_attributes(strong_parameters)
if (params[:device]['blacklist']
and params[:device]['blacklist'] == true
and @blacklist = Blacklist.create(device_id: @device.id))
# Handle stuff when everything is cool
render :device, status: 201 # will render with jbuilder @device and
else
# Handle stuff when there's no blacklist param true
end
else
# Handle error on model save
end
end