CZY to jest ładnie, napisane ? :)

Opis:

Ładuje plik GPX/XML i potrzebne mi są z niego tylko współrzędne. które są filtrowane aby minimalna odległość miedzy nimi była 50m.
User może mieć unikatowe nazwy plików bazie, na podstawie nazwy są wyświetlane markery na mapie.
Napisałem controller / model, wszystko działa.

Teraz pytanie czy to jest “ładnie/poprawnie napisane”,

CONTROLLER :

def create @location_file = @user.locations.new if @location_file.save_location(params[:location],@user) flash[:notice] = "Poprawnie dodano plik" else flash[:alert] = @location_file.errors.full_messages.join("<br>") end redirect_to user_path(@user) end
MODEL:

[code] def save_location(gpx2,user)
file_name = gpx2[:name].downcase.to_s

if file_exist?(gpx2) && file_name_exist?(file_name) && user_loaction_exist?(file_name,user)
  file = read_file(gpx2)
  hash = gpx_to_hash(file)
  new_hash = Geolocation.separation(hash)
  Location.transaction do 
    new_hash.each do |nh|
    Location.create(:name => file_name,
                  :lat=>nh[:lat],
                  :lng=>nh  [:lon],
                  :user_id => user.id )
    end
  end
else 
 false
end

end

private

sprawdzam czy plik został wysłany

def file_exist?(file)
if file[:gpx].nil?
errors.add(:gpx, “Nie wybrano pliku GPX!” )
false
else
true
end
end
#sprawdza czy nazwa pliku nie jeste pusta
def file_name_exist?(name)
if !name.blank?
true
else
errors.add(:name, “Nazwa nie moze byc pusta!”)
false
end
end

sprawdza czy dany user posiada współrzedne o takiej nazwie

def user_loaction_exist?(name,user)
object = user.locations.find_by_name(name)
if object.nil?
true
else
errors.add(:name, “Wspolrzedne o podanej nazwie istnieja” )
false
end
end
#zczytuje plik xml
def read_file(gpx)
gpx[:gpx].read
end

#zamieniam plik na hash wyodrebniajac zakladke wpt
def gpx_to_hash(file)
Hash.from_xml(file).with_indifferent_access[:gpx][:wpt]
end[/code]

Jest nieźle.
Kilka sugestii:


  1. ” w kodzie kontrolera powinno zapalać lampkę (nie zieloną). Najlepiej niech takie rzeczy z tej tablicy błędów robi helper.
  2. if MNÓSTWO KODU else return false można zastąpić przez early-return, czyli
    return false if !(file.exists? bla bla bla)
    MNÓSTWO KODU
  3. nazewnictwo: sprawdzasz nie tyle czy plik istnieje (oraz zbyt łatwo możesz pomylić własne funkcje z rubiowym File.exist?) tylko czy został przesłany. file_submitted?

Przy czym jeśli chodzi o punkt 2. to early return łatwo nadużyć do antywzorca, ale akurat w Twoim przypadku zadziała doskonale na czytelność i przejrzystość kodu.

Dzięki za sprawdzenie :slight_smile:

Jeszcze jedno pytanie. :smiley:

Jak wyłączyć, jeśli się da… żeby Flash nie wyświetlał nazwy pola formularza w info dotyczącym pola: przykład : “Gpx Nie wczytano pliku GPX!”, obecnie obszedłem to metodą w Helperze, która obcina pierwsze słowo z info.

user w save_location(gpx2,user) jest zbędny bo location_file = @user.locations.new czyli masz to w self.user

user_loaction_exist?(name,user) powinno leżeć w user.rb i wywołanie user.loaction_exist?(file_name)

tak w 5s

a także sobie pooglądaj: https://www.youtube.com/watch?v=T8J0j2xJFgQ

DZIĘKI :slight_smile: