Giter Club home page Giter Club logo

projectads's Introduction

== README

ProjectADS

Hi! This is a simple project for publication ads. It has a many roles user for manage. You can CRUD(create, read, edit, destroy) and search the ads. The ad can have a very many states. You easy can add many features. The project is written specifically for this. It has a rake task for publishing ads. I used a PostgreSQL. You can not run it in the Windows OS. I written a Rspec tests. For makeup I used a BootstrapCSS. You can also sync comment ads. Maybe I add other features. Let’s go andrey-ads.herokuapp.com

projectads's People

Contributors

cfc1020 avatar

Stargazers

 avatar

Watchers

 avatar

projectads's Issues

Не добавляются комменты

Пытаюсь добавить комментарий к объявлению, а он не добавляется. А появляется только при перезагрузке страницы.

Started POST "/ads/7/comments" for 127.0.0.1 at 2014-04-04 20:44:30 +0300
Processing by CommentsController#create as JS
  Parameters: {"utf8"=>"✓", "comment"=>{"text"=>"test\r\n"}, "commit"=>"Create Comment", "ad_id"=>"7"}
  User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1
  Ad Load (1.1ms)  SELECT "ads".* FROM "ads" WHERE "ads"."id" = $1 LIMIT 1  [["id", "7"]]
   (0.6ms)  BEGIN
  SQL (0.7ms)  INSERT INTO "comments" ("ad_id", "created_at", "text", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["ad_id", 7], ["created_at", Fri, 04 Apr 2014 17:44:30 UTC +00:00], ["text", "test\r\n"], ["updated_at", Fri, 04 Apr 2014 17:44:30 UTC +00:00], ["user_id", 1]]
   (1.2ms)  COMMIT
  Rendered sync/comments/_comment.html.erb (3.5ms)
undefined method `env' for nil:NilClass
  User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
  Rendered user_mailer/notification_for_new_comment_for_ad.html.erb (1.6ms)

Sent mail to [email protected] (5.5ms)
Date: Fri, 04 Apr 2014 20:44:30 +0300
From: [email protected]
To: [email protected]
Message-ID: <[email protected]>
Subject: Your ad commented
Mime-Version: 1.0
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

<h1>Your ad commented</h1>
    <p>
      Your ad (ad.id = 7) comment user UserName00<br/>
    </p>
    <p>
      Go to watch all comments http://example.com/ads/ad.id.
    </p>
    <p>Thanks for joining and have a great day!</p>
DEPRECATION WARNING: :confirm option is deprecated and will be removed from Rails 4.1. Use 'data: { confirm: 'Text' }' instead. (called from _app_views_sync_comments__comment_html_erb__4034938680850399274_70216485028420 at /Users/dima/Work/students/ProjectADS/app/views/sync/comments/_comment.html.erb:7)
  Rendered sync/comments/_comment.html.erb (4.2ms)
Redirected to http://localhost:3000/ads/7
Completed 302 Found in 52ms (ActiveRecord: 4.4ms)

Файлы-пустышки

Ошибка при загрузке картинки при неверном вводе контента объявления

// cfc1020: Изменил название ишью на более конкретное

  1. Иду на страницу http://localhost:3000/ads/new.
  2. Выбираю тип.
  3. Выбираю файл изображения для загрузки.
  4. Жму "Create Ad".

Падает ошибка:
ActionController::UrlGenerationError in Ads#create

Вот, что в консоли:

Started POST "/ads" for 127.0.0.1 at 2014-03-25 21:14:38 +0300
Processing by AdsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"fewXzS7MeQIeYamdw9WUwUaAIHZajo3Ocf3Kx/zUP6c=", "ad"=>{"type_id"=>"1", "content"=>"", "pictures_attributes"=>{"0"=>{"url"=>"", "_destroy"=>"false"}}, "images_attributes"=>{"0"=>{"photo"=>#<ActionDispatch::Http::UploadedFile:0x007f982e857a50 @tempfile=#<Tempfile:/var/folders/4f/nqqb6ksj0sjby87r4749cdr40000gn/T/RackMultipart20140325-15123-okgfn2>, @original_filename="Screen Shot 2014-03-25 at 8.48.21 PM.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"ad[images_attributes][0][photo]\"; filename=\"Screen Shot 2014-03-25 at 8.48.21 PM.png\"\r\nContent-Type: image/png\r\n">, "_destroy"=>"false"}}}, "commit"=>"Create Ad"}
  User Load (0.9ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1
Command :: file -b --mime-type '/var/folders/4f/nqqb6ksj0sjby87r4749cdr40000gn/T/d45127850ab452cabc4f18abd8838c0c20140325-15123-7jef5r'
Command :: identify -format '%wx%h,%[exif:orientation]' '/var/folders/4f/nqqb6ksj0sjby87r4749cdr40000gn/T/a2f640b107a1ad8980c6554493044e1420140325-15123-9rcnkr[0]' 2>/dev/null
Command :: identify -format %m '/var/folders/4f/nqqb6ksj0sjby87r4749cdr40000gn/T/a2f640b107a1ad8980c6554493044e1420140325-15123-9rcnkr[0]'
Command :: convert '/var/folders/4f/nqqb6ksj0sjby87r4749cdr40000gn/T/a2f640b107a1ad8980c6554493044e1420140325-15123-9rcnkr[0]' -auto-orient -resize "300x300>" '/var/folders/4f/nqqb6ksj0sjby87r4749cdr40000gn/T/a2f640b107a1ad8980c6554493044e1420140325-15123-9rcnkr20140325-15123-1amy5gx'
Command :: file -b --mime '/var/folders/4f/nqqb6ksj0sjby87r4749cdr40000gn/T/a2f640b107a1ad8980c6554493044e1420140325-15123-9rcnkr20140325-15123-1amy5gx'
Command :: identify -format '%wx%h,%[exif:orientation]' '/var/folders/4f/nqqb6ksj0sjby87r4749cdr40000gn/T/a2f640b107a1ad8980c6554493044e1420140325-15123-9rcnkr[0]' 2>/dev/null
Command :: identify -format %m '/var/folders/4f/nqqb6ksj0sjby87r4749cdr40000gn/T/a2f640b107a1ad8980c6554493044e1420140325-15123-9rcnkr[0]'
Command :: convert '/var/folders/4f/nqqb6ksj0sjby87r4749cdr40000gn/T/a2f640b107a1ad8980c6554493044e1420140325-15123-9rcnkr[0]' -auto-orient -resize "100x100>" '/var/folders/4f/nqqb6ksj0sjby87r4749cdr40000gn/T/a2f640b107a1ad8980c6554493044e1420140325-15123-9rcnkr20140325-15123-hvj5w4'
Command :: file -b --mime '/var/folders/4f/nqqb6ksj0sjby87r4749cdr40000gn/T/a2f640b107a1ad8980c6554493044e1420140325-15123-9rcnkr20140325-15123-hvj5w4'
   (0.2ms)  BEGIN
Command :: file -b --mime-type '/var/folders/4f/nqqb6ksj0sjby87r4749cdr40000gn/T/c2045052f9e9041a61635ca3f23d26b120140325-15123-b5u2qf'
  Type Load (0.5ms)  SELECT "types".* FROM "types" WHERE "types"."id" = $1 ORDER BY "types"."id" ASC LIMIT 1  [["id", 1]]
   (0.1ms)  ROLLBACK
  Type Load (0.3ms)  SELECT "types".* FROM "types"
  Rendered ads/_ad_form.html.erb (13.8ms)
  Rendered ads/new.html.erb within layouts/application (14.5ms)
Completed 500 Internal Server Error in 196ms

ActionView::Template::Error (No route matches {:ad_id=>#<Ad id: nil, content: "", user_id: 1, created_at: nil, updated_at: nil, type_id: 1, state: "draft">, :id=>#<Image id: nil, created_at: nil, updated_at: nil, photo_file_name: "Screen_Shot_2014-03-25_at_8.48.21_PM.png", photo_content_type: "image/png", photo_file_size: 31023, photo_updated_at: "2014-03-25 18:14:38", ad_id: nil>} missing required keys: [:ad_id, :id]):
    22: <% @ad.images.each do |img| %>
    23:   <p>
    24:     <%= img.photo.original_filename %>
    25:     <%= link_to "delete", ad_image_path(@ad, img), :method => :delete, :confirm => "Y/N?", :title => "Delete?" %> <br />
    26:   </p>
    27: <% end %>
  app/views/ads/_ad_form.html.erb:25:in `block in _app_views_ads__ad_form_html_erb___125916755770488293_70145783199060'
  app/views/ads/_ad_form.html.erb:22:in `_app_views_ads__ad_form_html_erb___125916755770488293_70145783199060'
  app/views/ads/new.html.erb:3:in `_app_views_ads_new_html_erb__2175818668604953269_70145783298200'
  app/controllers/ads_controller.rb:33:in `create'

Закоментированный код

Закоментированного кода в исходниках быть не должно. Он создает визуальный мусор для чтения и иногда сбивает с толку. У нас всегда есть гит, который хранит все версии исходников.

Одинаковые запросы на странице объявки

Started GET "/ads/7" for 127.0.0.1 at 2014-04-04 21:12:16 +0300
Processing by AdsController#show as JS
  Parameters: {"id"=>"7"}
  User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1
  Ad Load (1.1ms)  SELECT "ads".* FROM "ads" WHERE "ads"."id" = $1 LIMIT 1  [["id", "7"]]
  User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
  Type Load (0.3ms)  SELECT "types".* FROM "types" WHERE "types"."id" = $1 ORDER BY "types"."id" ASC LIMIT 1  [["id", 1]]
  Image Load (0.7ms)  SELECT "images".* FROM "images" WHERE "images"."ad_id" = $1  [["ad_id", 7]]
  Rendered images/_image.html.erb (5.4ms)
DEPRECATION WARNING: :confirm option is deprecated and will be removed from Rails 4.1. Use 'data: { confirm: 'Text' }' instead. (called from _app_views_ads__ad_html_erb__2326537419676740175_70216484298100 at /Users/dima/Work/students/ProjectADS/app/views/ads/_ad.html.erb:11)
  Rendered ads/_ad.html.erb (33.1ms)
  Comment Load (0.6ms)  SELECT "comments".* FROM "comments" WHERE "comments"."ad_id" = $1  [["ad_id", 7]]
  CACHE (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
DEPRECATION WARNING: :confirm option is deprecated and will be removed from Rails 4.1. Use 'data: { confirm: 'Text' }' instead. (called from _app_views_sync_comments__comment_html_erb__4034938680850399274_70216485028420 at /Users/dima/Work/students/ProjectADS/app/views/sync/comments/_comment.html.erb:7)
  Rendered sync/comments/_comment.html.erb (10.3ms)
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
DEPRECATION WARNING: :confirm option is deprecated and will be removed from Rails 4.1. Use 'data: { confirm: 'Text' }' instead. (called from _app_views_sync_comments__comment_html_erb__4034938680850399274_70216485028420 at /Users/dima/Work/students/ProjectADS/app/views/sync/comments/_comment.html.erb:7)
  Rendered sync/comments/_comment.html.erb (2.4ms)
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
DEPRECATION WARNING: :confirm option is deprecated and will be removed from Rails 4.1. Use 'data: { confirm: 'Text' }' instead. (called from _app_views_sync_comments__comment_html_erb__4034938680850399274_70216485028420 at /Users/dima/Work/students/ProjectADS/app/views/sync/comments/_comment.html.erb:7)
  Rendered sync/comments/_comment.html.erb (4.8ms)
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
DEPRECATION WARNING: :confirm option is deprecated and will be removed from Rails 4.1. Use 'data: { confirm: 'Text' }' instead. (called from _app_views_sync_comments__comment_html_erb__4034938680850399274_70216485028420 at /Users/dima/Work/students/ProjectADS/app/views/sync/comments/_comment.html.erb:7)
  Rendered sync/comments/_comment.html.erb (3.8ms)
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
DEPRECATION WARNING: :confirm option is deprecated and will be removed from Rails 4.1. Use 'data: { confirm: 'Text' }' instead. (called from _app_views_sync_comments__comment_html_erb__4034938680850399274_70216485028420 at /Users/dima/Work/students/ProjectADS/app/views/sync/comments/_comment.html.erb:7)
  Rendered sync/comments/_comment.html.erb (5.3ms)
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
DEPRECATION WARNING: :confirm option is deprecated and will be removed from Rails 4.1. Use 'data: { confirm: 'Text' }' instead. (called from _app_views_sync_comments__comment_html_erb__4034938680850399274_70216485028420 at /Users/dima/Work/students/ProjectADS/app/views/sync/comments/_comment.html.erb:7)
  Rendered sync/comments/_comment.html.erb (6.2ms)
  CACHE (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
DEPRECATION WARNING: :confirm option is deprecated and will be removed from Rails 4.1. Use 'data: { confirm: 'Text' }' instead. (called from _app_views_sync_comments__comment_html_erb__4034938680850399274_70216485028420 at /Users/dima/Work/students/ProjectADS/app/views/sync/comments/_comment.html.erb:7)
  Rendered sync/comments/_comment.html.erb (6.2ms)
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
DEPRECATION WARNING: :confirm option is deprecated and will be removed from Rails 4.1. Use 'data: { confirm: 'Text' }' instead. (called from _app_views_sync_comments__comment_html_erb__4034938680850399274_70216485028420 at /Users/dima/Work/students/ProjectADS/app/views/sync/comments/_comment.html.erb:7)
  Rendered sync/comments/_comment.html.erb (1.4ms)
  Rendered comments/_comment_form.html.erb (1.2ms)
  Rendered ads/show.html.erb within layouts/application (117.5ms)
  Rendered layouts/_header.html.erb (0.4ms)
  Rendered layouts/_adblock_detect.html.erb (0.1ms)
  Rendered layouts/_header.html.erb (0.7ms)
Completed 200 OK in 163ms (Views: 138.7ms | ActiveRecord: 4.3ms)

Картинки с диска

Нет возможности загрузить картинки с диска. Предлагает только загрузку по url.

Миграции не проходят

Скачал послежнюю версию кода из репозитория и у меня не проходит миграция:

$ b rake db:migrate
==  AddAdIdToImages: migrating ================================================
-- add_column(:images, :ad_id, :integer)
rake aborted!
An error has occurred, this and all later migrations canceled:

PG::DuplicateColumn: ERROR:  column "ad_id" of relation "images" already exists
: ALTER TABLE "images" ADD COLUMN "ad_id" integer
...
/Users/dima/Work/students/ProjectADS/db/migrate/20140325140942_add_ad_id_to_images.rb:3:in `change'
...

Такое состояние:

$ b rake db:migrate:status
database: project_ads_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20140226194542  Create users
   up     20140227073029  Add devise to users
   up     20140227102802  Create ads
   up     20140301090717  Create pictures
   up     20140301115050  Create types
   up     20140301115649  Add type id to ad
   up     20140301122701  Add state to ad
   up     20140322101003  Create comments
   up     20140325135713  Create images
   up     20140325135835  Add attachment photo to images
  down    20140325140942  Add ad id to images

Версия руби

Для того, чтобы у всех разработчиков была одна версия руби — принято в репозитории хранить файл .ruby-version с номером версии.

Но не нужно этот файл создавать вручную, rvm и rbenv умеют его создавать автоматически.

Бд в девелопменте и продакшне

В девелопменте нужно использовать ту же субд, что и на продакшне, т.к. разные субд могут иметь разный набор поддерживаемых возможностей.

Обычно мы используем Postgres.

Админ не может управлять объявками

Захожу на http://localhost:3000/admin/ads/moderate и получаю ошибку:

Started GET "/admin/ads/moderate" for 127.0.0.1 at 2014-04-04 21:00:50 +0300
Processing by Admin::AdsController#moderate as HTML
  User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 2 ORDER BY "users"."id" ASC LIMIT 1
   (0.3ms)  SELECT COUNT(*) FROM "ads" WHERE "ads"."state" = 'pending'
  Ad Load (0.3ms)  SELECT "ads".* FROM "ads" WHERE "ads"."state" = 'pending' LIMIT 5 OFFSET 0
  Type Load (0.3ms)  SELECT "types".* FROM "types" WHERE "types"."id" IN (1)
  User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" IN (1)
  Image Load (0.3ms)  SELECT "images".* FROM "images" WHERE "images"."ad_id" IN (6)
  Rendered ads/index.html.erb within layouts/application (7.0ms)
Completed 500 Internal Server Error in 12ms

ActionView::Template::Error (Missing partial admin/ads/ad with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}. Searched in:
  * "/Users/dima/Work/students/ProjectADS/app/views"
  * "/Users/dima/.rvm/gems/ruby-2.0.0-p353/gems/devise-3.2.3/app/views"
):
    10:
    11: <%= will_paginate @ads %>
    12:
    13: <%= render @ads %>
    14:
    15: <%= will_paginate @ads %>
  app/views/ads/index.html.erb:13:in `_app_views_ads_index_html_erb__1027305686845122902_70216483999860'
  app/controllers/admin/ads_controller.rb:9:in `moderate'


  Rendered /Users/dima/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.1ms)
  Rendered /Users/dima/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.0ms)
  Rendered /Users/dima/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (9.8ms)

Примеры конфигов

Да, конфиги принято не хранить в репозитории, но пример конфигов должен быть. Например может быть файл config/database.yml.example, который я смогу скопировать в database.yml, минимально подправить и запустить сервер.

Image vs. Picture

Чем отличаются модели Image и Picture? По логике кажется, что это одинаковые сущности.

Тесты

Нет тестов контроллеров и нет интеграционных тестов.
Не все текущие тесты проходят.

N+1 запрос на странице просмотра объявлений

Если посмотреть в консоль, то увидим:

  1. повторяющиеся запросы:
SELECT "types".* FROM "types" WHERE "types"."id" = $1 ORDER BY "types"."id" ASC LIMIT 1  [["id", 1]]
SELECT "types".* FROM "types" WHERE "types"."id" = $1 ORDER BY "types"."id" ASC LIMIT 1  [["id", 1]]
SELECT "types".* FROM "types" WHERE "types"."id" = $1 ORDER BY "types"."id" ASC LIMIT 1  [["id", 1]]
...
  1. запросы, с параметром, увеличивающимся на 1:
SELECT "pictures".* FROM "pictures" WHERE "pictures"."ad_id" = $1  [["ad_id", 1]]
SELECT "pictures".* FROM "pictures" WHERE "pictures"."ad_id" = $1  [["ad_id", 2]]
SELECT "pictures".* FROM "pictures" WHERE "pictures"."ad_id" = $1  [["ad_id", 3]]
...
  1. и др.

Всегда нужно стараться делать запросы как можно более оптимально. И запросов, чаще всего, должно быть как можно меньше.

Нет сидов

Нет сидов, что усложняет разворачивание проекта.

Смесь табов и пробелов

В рубишных проектах для отступов принято использовать пробелы. Один уровень отступа — два пробела. Сейчас на проекте смешаны и табы и пробелы. Лучше всего один раз настроить редактор, чтобы никогда больше таких проблем не возникало.

Также стоит настроить редактор так, чтобы он удалял пробельные символы в конце строк и ставил перевод строки в конце файла, если его нет.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.