Используйте POST или GET-запрос со статических URL-адресов в шаблоне в Rails - PullRequest
1 голос
/ 09 июня 2011

Пожалуйста, потерпите меня, так как я новичок в программировании на Rails и вообще. У меня очень ограниченное понимание того, как работают модели, представления, контроллеры, но я учился настолько быстро, насколько смог.

У меня проблемы с тем, как я могу генерировать полустатические промежуточные страницы на основе данных, которые у меня уже есть. Сейчас это просто поиск по почтовому индексу, страница со списком результатов и страница магазина. Я хочу, чтобы это было структурировано State-city-list-shop

В моей базе данных находятся магазины, которые были геокодированы и доступны на стороне клиента с помощью поиска по почтовому индексу. Итак, я имею дело с контроллером Shops, который имеет обычную настройку типа скаффолда, поэтому URL-адрес выглядит как / shops / 1 для представления шоу. То, что я хотел бы, это магазины / Аляска / якорная стоянка / название магазина с сухарями.

У меня нет контроллера "Состояния" или "Города", поэтому я бы предположил, что вам придется сделать это для построения маршрутов.

Я сделал статические страницы шаблонов состояний, и для каждого штата я перечисляю города со ссылками, похожими на Город . У меня есть файл index.html в каждой из папок State, но в / shop / state / city ничего нет

Я сделал это так, потому что я могу получить результаты от этого:

/ магазины / find_shops? = Застежка-молния = Город & Расстояние = 5
Который, если бы я мог получить тот же результат для / штат / город / магазины Я был бы счастлив.

Потому что тогда я мог бы щелкнуть по одному из магазинов в этом списке, и это привело бы меня на страницу магазинов, которая является / shops / 7499 (: id), и было бы лучше иметь / / / магазин-название штата город

Вот Контроллер магазина - администратор просто защищает публику от редактирования информации об адресе магазина. Как вы увидите, он принимает файл CSV, анализирует и сохраняет в базе данных.

    def admin_index
    #@shops = Shop.find(:all)

    @shops = Shop.paginate( :per_page => 35, 
                   :page => params[:page])

    @shops_to_geocode = Shop.fetch_not_geocoded
  end

  def geocode_shops
    @shops_to_geocode = Shop.fetch_not_geocoded
    cnt = 0
    for shop in @shops_to_geocode
      shop.geocode_raw_address
      shop.save!
    end
    redirect_to :action => 'admin_index'
  end

  def upload_file
    file_path = params[:file_path]
    if file_path
      Shop.import( file_path )
    end
    redirect_to :action => 'admin_index' 
  end

  # GET /shops
  # GET /shops.xml
  def index
    @zip = params[:zip]
    @distance = params[:distance]

    if @zip && @distance 
      @shops = Shop.find(:all, :origin => @zip, :conditions => ["distance < ?", @distance])
      logger.debug( "found #{@shops.length} shops" )

      if @shops.length == 0
        geo = GeoKit::Geocoders::MultiGeocoder.geocode( @zip )
        errors.add(:address, "Could not Geocode address") if !geo.success
        @centerLat, @centerLng = geo.lat,geo.lng if geo.success
      else
        @centerLat = @shops[0].lat
        @centerLng = @shops[0].lng
      end
    else
      @shops = []

      geo = GeoKit::Geocoders::IpGeocoder.geocode(request.remote_ip)
      if geo.success
        @centerLat, @centerLng = geo.lat,geo.lng 
      else
        logger.debug( "unable to geocode remote ip" )
        @centerLat = 42 
        @centerLng = -120 
      end
    end

    if @distance.nil?
      @distance = 5
    end

А вот и Shop.rb

require 'net/http'

class Shop < ActiveRecord::Base

  acts_as_mappable

  DATA_FILE_COLS =
    [
      "---",
      "Site",
      "Zip Search",
      "Shop",
      "Address",
      "Phone",
      "Make",
      "Affiliations",
      "Specialties",
      "Amenities",
      "Timestap",
    ]

  FIELDS = 
    {
      "---" => "-1",
      "Site" => "-1",
      "Zip Search" => "-1",
      "Shop" => "name",
      "Address" => "raw_address",
      "Phone" => "phone_number",
      "Make" => "make",
      "Affiliations" => "affiliations",
      "Specialties" => "specialties",
      "Amenities" => "amenities",
      "Timestap" => "-1"
    }


  def full_address
    "#{address_1} #{city} #{state} #{postal_code}"
  end

  def valid_for_geocoding?
    rtn = true 
    if self.full_address.nil? || self.full_address.to_s.empty? 
       rtn = false 
    end

    return rtn 
  end

  def geocode_address
    geo = GeoKit::Geocoders::MultiGeocoder.geocode( full_address )
    errors.add(:address, "Could not Geocode address") if !geo.success
    self.lat, self.lng = geo.lat,geo.lng if geo.success
  end

  def geocode_raw_address
        geo = GeoKit::Geocoders::MultiGeocoder.geocode(self.raw_address)
        if ( geo.success )
          self.address_1 = geo.street_address
          self.city = geo.city
          self.state = geo.state
          self.postal_code = geo.zip
          self.lat = geo.lat
          self.lng = geo.lng
        end
  end

  def self.import( file_path )
    url = 'http://example.com'
    #file = '/filename.txt'
    file = file_path


    response = Net::HTTP.get_response(URI.parse(url + file))
    body = response.body
    lines = body.split("\r\n")

    line_cnt = 0

    lines.each { |line| 
      if line_cnt > 1
        words = line.split("\"")
        cnt = 0
        shop_atrbs = Hash.new
        words.each { |word|
          if word != ","
            #puts "#{fields[cnt]} : #{word.strip}"
            field = FIELDS[DATA_FILE_COLS[cnt]]
            if field != "-1"
              shop_atrbs[field] = word.strip
            end
            cnt = cnt + 1
          end
        }
        shop = Shop.new
        shop.update_attributes(shop_atrbs)
        geo = GeoKit::Geocoders::MultiGeocoder.geocode(shop.raw_address)
        shop.address_1 = geo.street_address
        shop.city = geo.city
        shop.state = geo.state
        shop.postal_code = geo.zip
        shop.lat = geo.lat
        shop.lng = geo.lng
        shop.save

      end
      line_cnt = line_cnt + 1
    }    #f.each{ |line| puts '#{f.lineno}: #{line}' }
  end

  def self.fetch_not_geocoded
    find( :all,
    :conditions => ['lat IS NULL || lng IS NULL || lat = ? || lng = ?', "", ""],
    :limit => 10000)
  end

  def self.find_for_sitemap(offset, limit)
    find( :all, 
          :select => 'id, name, updated_at',
          :order => 'updated_at DESC',
          :offset => offset,
          :limit => limit )
  end

end

Итак, я хочу получить работу - / Аляска / Анкоридж / Список магазинов / (чистый URL)

Что я могу сделать прямо сейчас - / find_shops? zip = привязка и расстояние = 5

Наконец, это рельсы 2.3.2, и я потратил так много времени, пытаясь преобразовать его в рельсы 3.0, но пока не добился успеха.

1 Ответ

0 голосов
/ 09 июня 2011

Вы читали руководство по маршрутизации Rails "Маршрутизация по внешней стороне"? В частности, раздел 4 описывает, как этого можно достичь.

...