2010-12-14 7 views
0

Je suis nouveau sur Rails3, et j'essaie juste d'avoir une dernière chose à faire avant de l'appeler une nuit. La situation est la suivante (s'il vous plaît si le code est horrible, faites le moi savoir, encore en train d'apprendre):rails3 has_one création d'un modèle d'association

Je veux enregistrer une plongée. Je pourrais avoir un nouvel emplacement sur cette plongée à quel point je dois créer un nouvel emplacement, puis créer la plongée. Une plongée a un seul endroit. Un emplacement a_many plongées. Actuellement, la clé étrangère est en plongée sous le nom location_id.

Comment puis-je correctement, dans mon Dives_Controller, générer l'emplacement, obtenir l'ID et le transmettre à ma nouvelle plongée? Ce serait bien que le constructeur de Location soit appelé, mais si ça ne marche pas comme ça, alors ça ira aussi.

Mon code est ci-dessous:

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 

Répondre

0

En fait, votre modélisation a besoin un peu de travail et vous devriez regarder 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