2010-12-14 24 views
0

私はRails3を使い慣れていません。状況は次のとおりです(コードが恐ろしい場合は、是非教えてください)。rails3 has_one関連モデルの作成

ダイビングをログに記録します。私はその地点で新しい地点を作って、新しい地点を作成してからダイビングを作成する必要があります。ダイビングは一箇所にあります。場所には数多くのダイビングがあります。現在、外部キーはlocation_idとしてダイビング中です。

dives_controllerで場所を生成してIDを取得し、それを新しいダイビングに渡すにはどうすればよいですか?場所のコンストラクタを呼び出すのはいいでしょうが、それがうまく動作しない場合は、それも問題ありません。

私のコードは以下の通りです:

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 
関連する問題