如果请求参数存在,则在rails中创建对象

时间:2015-08-11 12:14:40

标签: ruby-on-rails json ruby-on-rails-4

我有一个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

但我不喜欢那么多:

  1. 一个控制器中的逻辑太多
  2. 验证内部参数是一个好习惯吗?
  3. 如果没有给出参数,如何处理请求?我知道强参数应该返回400,但我刚创建的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 呢。
  4. 这个控制器闻起来像我。

    欢迎提供反馈。

    执行PATCH时的结果

    @device

2 个答案:

答案 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