Пожалуйста, потерпите меня, так как я новичок в программировании на 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, но пока не добился успеха.