2010-12-14 2 views
0

Я новичок в Rails3, и я просто пытаюсь получить последнюю работу, прежде чем я назову ее ночью. Ситуация следующая (пожалуйста, если код ужасен, просто дайте мне знать, все еще учитесь):rails3 создание модели ассоциации has_one

Я хочу зарегистрировать погружение. У меня может быть новое место на этом погружении, в котором я должен создать новое местоположение, а затем создать погружение. Место погружения имеет место. Место has_many погружения. В настоящее время внешний ключ находится на погружении как location_id.

Как я могу, в моем dives_controller, сгенерировать местоположение, получить идентификатор и передать его моему новому погружению? Было бы неплохо иметь конструктор Location, но если это не сработает, то это тоже нормально.

Мой код ниже:

class Dive < ActiveRecord::Base 
    belongs_to :user 
    has_one :location 

end 

require 'json' 
require 'net/http' 
require 'uri' 

class Location < ActiveRecord::Base 
    has_many :dive 

    def initialize(location) 
     @name = location[:name] 
     @city = location[:city] 
     @region = location[:region] 
     @country = location[:country] 

     url = "http://maps.googleapis.com/maps/api/geocode/json?address="+location[:city].sub(' ', '+')+"+"+location[:region].sub(' ', '+')+"+"+location[:country].sub(' ', '+')+"&sensor=false" 
     resp = Net::HTTP.get_response(URI.parse(url)) 
     googMapsResponse = JSON.parse(resp.body) 

     @latitude = googMapsResponse["results"][0]["geometry"]["location"]["lat"] 
     @longitude = googMapsResponse["results"][0]["geometry"]["location"]["lng"] 
    end 

    def to_str 
     "#{self.name}::#{self.city}::#{self.region}::#{self.country}" 
    end 
end 

class DivesController < ApplicationController 
    def create 
    @dive = Dive.new(params[:dive]) 

    if params[:location][:id] == "" then 
     @location = create_location(params[:location]) 

     @dive.location_id = @location.id 
    else 
     @dive.location_id = params[:location][:id] 
    end 

    @dive.user_id = params[:user][:id] 
    end 
end 

ответ

0

На самом деле, ваше моделирование требует доработки, и вы должны смотреть на nested_attributes.

class Dive < ActiveRecord::Base 
    belongs_to :user 
    has_one :location 
end 

class Location < ActiveRecord::Base 
    has_many :dives 

    def to_str 
     ... 
    end 
end 

class DivesController < ApplicationController 
    def create 
    @dive = Dive.new(params[:dive]) 

    if params[:location][:id] == "" then 
     # Create new Location 
     @location = Location.new(params[:location]) 
     url = "http://maps.googleapis.com/maps/api/geocode/json?address=" + 
      @location[:city].sub(' ', '+') + "+" + 
     @location[:region].sub(' ', '+') + "+" + 
      @location[:country].sub(' ', '+') + "&sensor=false" 
     resp = Net::HTTP.get_response(URI.parse(url)) 
     googMapsResponse = JSON.parse(resp.body) 

     @location.latitude = googMapsResponse["results"][0]["geometry"]["location"]["lat"] 
     @location.longitude = googMapsResponse["results"][0]["geometry"]["location"]["lng"] 
     @location.save 

     @dive.location = @location 
    else 
     @dive.location_id = params[:location][:id] 
    end 

    # This can be improved 
    @dive.user_id = params[:user][:id] 

    if @dive.save 
     # do something 
    else 
     # do something else 
    end 
    end 
end 
Смежные вопросы