2016-02-24 7 views
1

У меня в проекте Rails 5 api две модели: Места и маяки (Place has_many Beacons, foreign key: place_id). Этот API принимает JSON, например, эта:Сохранение массива параметров в Rails

{ 
    "place":{ 
    "name": "bedroom" 
    }, 
    "beacon":{ 
    "SSID": "My Wi-Fi", 
    "BSSID": "00:11:22:33:44:55", 
    "RSSI": "-55" 
    } 
} 

Это JSON работает просто отлично, с этими классами:

def create 
    @place = Place.new(place_params) 
    @beacon = Beacon.new(beacon_params) 


    if @place.save 
     @[email protected] 
     if @beacon.save 
     render :json => {:place => @place, :beacon => @beacon}, status: :created, location: @places 
     else 
     render json: @beacon.errors, status: :unprocessable_entity 
     end 
    else 
     render json: @place.errors, status: :unprocessable_entity 
    end 
end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_place 
     @place = Place.find(params[:id]) 
    end 

    # Only allow a trusted parameter "white list" through. 
    def place_params 
     params.require(:place).permit(:name) 
    end 

    def beacon_params 
    params.require(:beacon).permit(:SSID, :BSSID, :RSSI) 
    end 

Однако я хочу, чтобы передать несколько -маяков объектов в том же формате JSON в массиве (даже без маяков). Как сохранить все маяки в массиве параметров и сгенерировать ответ, содержащий все из них?

ответ

1

Я принимаю место has_many :beacons. Если это так, вы можете использовать вложенные атрибуты. Это позволяет назначать и обновлять вложенный ресурс, в данном случае Beacons. Во-первых, в вашей Place модели:

accepts_nested_attributes_for :beacons 

Затем измените метод place_params в контроллере, чтобы разрешить вложенные атрибуты маяка:

def place_params 
    params.require(:place).permit(:name, beacons_attributes: [:id, :SSID, :BSSID, :RSSI]) 
end 

и ваш JSON:

{ 
    "place":{ 
    "name": "bedroom", 
    "beacons_attributes": [ 
     { 
     "SSID": "My Wi-Fi", 
     "BSSID": "00:11:22:33:44:55", 
     "RSSI": "-55" 
     }, { 
     //more beacons here 
     } 
    ] 
    }, 

} 

Вы можете имеют ноль, один или несколько маяков, и могут делать то же самое при обновлении, если вы включаете идентификаторы маяков.

Вам также не нужно будет создавать @beacon вручную и может просто сделать это: @place = Place.new(place_params), и он автоматически создаст маяки и свяжет их с местом.

Вы можете прочитать здесь, если вы хотите получить больше информации или разъяснения: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

Edit: я пропустил, где вы спросили, как включить маяки в ответ. Самый быстрый способ просто включить его в оказании JSon:

render :json => @place.to_json(:include => :beacons) 

Вы можете использовать Активные сериализаторы модели (https://github.com/rails-api/active_model_serializers), JBuilder (https://github.com/rails/jbuilder), или более просто просто переопределить метод to_json на вашей модели.

Смежные вопросы