2015-11-16 143 views
0

我有紅寶石的rails應用程序和我的控制器應處理創建許多對象的請求。對象數據通過json使用POST方法從客戶端傳遞。Ruby on Rails和JSON請求處理

我的請求的示例(記錄從控制器):

Processing by PersonsController#save_all as JSON 

Parameters: {"_json"=>[{"date"=>"9/15/2014", "name"=>"John"}, 
     {"date"=>"9/15/2014", "name"=>"Mike"}], "person"=>{}} 

所以我需要保存這兩個用戶,但我有一些問題:

  1. 如何在這裏驗證強勁的參數?只有名稱和日期屬性可以從客戶端傳遞
  2. 如何使用Person.new(params)將字符串轉換爲日期?
  3. 我可以以某種方式預處理我的json嗎?比如我要替換NAME =「邁克」NAME =「邁克用戶」,然後才通過它在我的模型
  4. 我希望通過添加一些默認參數,例如,以豐富每個人的參數,可以我想補充狀態=「new_created」以人PARAMS

回答

1

首先我會名稱的根PARAM像「用戶」,那麼它給出的所有連接到控制器名稱和數據結構正在發送。

關於強參數。配置取決於你的Rails應用程序版本。 < = 3.x沒有包括這個,所以你需要添加gem。如果你是> = 4.x,那麼這已經是rails的一部分。

接下來在你的控制器中,你需要定義一個方法來過濾你需要的參數。我應該看起來像這樣:

class PeopleController < ApplicationController 
    def some_action 
    # Here you can call a service that receives people_params and takes 
    # care of the creation. 
    if PeopleService.new(people_params).perform 
     # some logic 
    else 
     # some logic 
    end 
    end 

    private 

    def base_people_params 
    params.permit(people: [:name, :date]) 
    end 
    # Usually if you don't want to manipulate the params then call the method 
    # just #people_params 

    def people_params 
    base_people_params.merge(people: normalized_params) 
    end 
    # In case you decided to manipulate the params then create small methods  
    # that would that separately. This way you would be able to understand this 
    # logic when returning to this code in a couple of months. 

    def normalized_params 
    return [] unless params[:people] 

    params[:people].each_with_object([]) do |result, person| 
     result << { 
     name: normalize_name(person[:name]), 
     date: normalize_date(person[:date]), 
     } 
    end 
    end 

    def normalize_date(date) 
    Time.parse(date) 
    end 

    def normalize_name(name) 
    "#{name} - User" 
    end 
end 

如果您看到代碼開始進入自定義進入服務。這將有助於幫助您保持控制器精簡(和健康)。

當你在當時創建一個原因(而不是像這裏那樣的批處理)時,代碼更簡單一點,你使用散列而不是數組......但它幾乎是相同的。

編輯:

如果您不需要操縱特定PARAM那麼就不要

def normalized_params 
    return [] unless params[:people] 

    params[:people].each_with_object([]) do |result, person| 
    result << { 
     name: person[:name], 
     date: normalize_date(person[:date]), 
    } 
    end 
end 
+0

THX了很多,但如果我不需要normalize_name名而錯過這一行,然後它從結果參數集中消失 –