From d77f296f769e9ce12e8bde64d08da3babb2ff141 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Thu, 29 Mar 2012 22:04:31 +0200 Subject: [PATCH 01/17] =?UTF-8?q?Creada=20acci=C3=B3n=20author?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/images/carlos.jpg | Bin 0 -> 26053 bytes app/assets/images/quique.jpg | Bin 0 -> 25921 bytes app/controllers/planet_controller.rb | 3 +++ app/views/planet/author.html.erb | 30 +++++++++++++++++++++++++++ config/routes.rb | 1 + 5 files changed, 34 insertions(+) create mode 100644 app/assets/images/carlos.jpg create mode 100644 app/assets/images/quique.jpg create mode 100644 app/views/planet/author.html.erb diff --git a/app/assets/images/carlos.jpg b/app/assets/images/carlos.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a2a154f294b4fdff33c3d3ff41713c6c0b4e02de GIT binary patch literal 26053 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 IvD5MY13_MGApigX literal 0 HcmV?d00001 diff --git a/app/controllers/planet_controller.rb b/app/controllers/planet_controller.rb index be7ac0a..0421a76 100644 --- a/app/controllers/planet_controller.rb +++ b/app/controllers/planet_controller.rb @@ -7,5 +7,8 @@ def contact def ejemplo end + + def author + end end diff --git a/app/views/planet/author.html.erb b/app/views/planet/author.html.erb new file mode 100644 index 0000000..2937e6b --- /dev/null +++ b/app/views/planet/author.html.erb @@ -0,0 +1,30 @@ +

Authors

+

+Nombre: Carlos Crespo González
+Dirección postal: c/Bravo Murillo 333, 2ºD
+Código postal: 28020
+E-mail: carlos.crespog@gmail.com
+<%= image_tag("carlos.jpg") %>
+Breve currículum:
+

    +
  • Estudios:"Ingeniero de Telecomunicaciones" ETSI de Telecomunicación,Universidad Politécnica de Madrid (UPM)
  • +
  • Idiomas: Español (lengua materna), Inglés
  • +
  • Lenguajes de programación: HTML, CSS, Javascript, JQuery, Java, C, RoR, Android, NodeJs
  • +
  • Experiencia laboral: Grupo de sistemas inteligentes (GSI) - UPM
  • +
+

+ +

+Nombre: Enrique García Navalón
+Dirección postal: c/ Paseo de la Castellana 110, 4ºC
+Código postal: 28018
+E-mail: garcianavalon@gmail.com
+<%= image_tag("quique.jpg") %>
+Breve currículum:
+

    +
  • Estudios:"Ingeniero de Telecomunicaciones" ETSI de Telecomunicación,Universidad Politécnica de Madrid (UPM)
  • +
  • Idiomas: Español (lengua materna), Inglés, Francés
  • +
  • Lenguajes de programación: HTML, CSS, Javascript, JQuery, Java, C, RoR
  • +
  • Experiencia laboral: Vigo Electronics & Science
  • +
+

\ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 716dc7e..ac79edd 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,6 +11,7 @@ get "planet/ejemplo" + get "planet/author" # The priority is based upon order of creation: # first created -> highest priority. From 34dea3f7b31c585b15f5d22c21db39e477ddea74 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Thu, 29 Mar 2012 22:11:32 +0200 Subject: [PATCH 02/17] Definidos tests de funcionalidad para author y ejemplo --- test/functional/planet_controller_test.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/functional/planet_controller_test.rb b/test/functional/planet_controller_test.rb index 88229e0..38fff5c 100644 --- a/test/functional/planet_controller_test.rb +++ b/test/functional/planet_controller_test.rb @@ -1,6 +1,7 @@ require 'test_helper' class PlanetControllerTest < ActionController::TestCase + test "should get index" do get :index assert_response :success @@ -11,4 +12,16 @@ class PlanetControllerTest < ActionController::TestCase assert_response :success end + test "should get author" do + get :author + assert_response :success + end + + test "should get ejemplo" do + get :ejemplo + assert_response :success + end + + + end From a86515a920ecddff0e1dd756eb5e6c3788a95186 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Thu, 29 Mar 2012 22:53:59 +0200 Subject: [PATCH 03/17] =?UTF-8?q?A=C3=B1adida=20=C3=BAltima=20modificaci?= =?UTF-8?q?=C3=B3n=20en=20types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/types/index.html.erb | 3 +++ app/views/types/show.html.erb | 4 ++++ config/routes.rb | 2 ++ 3 files changed, 9 insertions(+) diff --git a/app/views/types/index.html.erb b/app/views/types/index.html.erb index e761359..10293ec 100644 --- a/app/views/types/index.html.erb +++ b/app/views/types/index.html.erb @@ -3,6 +3,7 @@ <% @types.each do |type| %> + @@ -28,3 +30,4 @@
<%= link_to 'New Type', new_type_path %> + diff --git a/app/views/types/show.html.erb b/app/views/types/show.html.erb index 98b32e7..811d453 100644 --- a/app/views/types/show.html.erb +++ b/app/views/types/show.html.erb @@ -10,6 +10,10 @@ <%= @type.description %>

+

+ Última modificación: + <%= @type.updated_at %> +

<%= link_to 'Edit', edit_type_path(@type) %> | <%= link_to 'Back', types_path %> diff --git a/config/routes.rb b/config/routes.rb index ac79edd..48fa0ac 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,6 +12,8 @@ get "planet/ejemplo" get "planet/author" + + # The priority is based upon order of creation: # first created -> highest priority. From b0bd3b7d8a7ed1dd08190958c68cee5721ad2e66 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Thu, 29 Mar 2012 23:30:27 +0200 Subject: [PATCH 04/17] =?UTF-8?q?A=C3=B1adida=20acci=C3=B3n=20ordered=5Fin?= =?UTF-8?q?dex?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/types_controller.rb | 11 +++++++ app/views/sites/index.html.erb | 6 ++-- app/views/types/ordered_index.html.erb | 41 ++++++++++++++++++++++++++ config/routes.rb | 4 +++ 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 app/views/types/ordered_index.html.erb diff --git a/app/controllers/types_controller.rb b/app/controllers/types_controller.rb index da826f4..d586eb8 100644 --- a/app/controllers/types_controller.rb +++ b/app/controllers/types_controller.rb @@ -9,7 +9,16 @@ def index format.json { render json: @types } end end + # GET /types/ordered_index + # GET /types/ordered_index.json + def ordered_index + @types = Type.find(:all, :order => :name) + respond_to do |format| + format.html # index.html.erb + format.json { render json: @types } + end + end # GET /types/1 # GET /types/1.json def show @@ -80,4 +89,6 @@ def destroy format.json { head :no_content } end end + + end diff --git a/app/views/sites/index.html.erb b/app/views/sites/index.html.erb index f1034b8..f28645d 100644 --- a/app/views/sites/index.html.erb +++ b/app/views/sites/index.html.erb @@ -13,7 +13,9 @@
<%= link_to site.name, site %>
<%= truncate(strip_tags(site.description), - :length => 80) %>
+ :length => 80) %> +
Última modificación: <%= type.updated_at %> +
@@ -31,4 +33,4 @@
-<%= link_to 'New site', new_site_path %> \ No newline at end of file +<%= link_to 'New Type', new_site_path %> \ No newline at end of file diff --git a/app/views/types/ordered_index.html.erb b/app/views/types/ordered_index.html.erb new file mode 100644 index 0000000..7fbb37d --- /dev/null +++ b/app/views/types/ordered_index.html.erb @@ -0,0 +1,41 @@ +
+ +

Listing Types

+ +
@@ -10,6 +11,7 @@
<%= link_to type.name, type_sites_path(type) %>
<%= truncate(strip_tags(type.description), :length => 80) %>
+
Última modificación: <%=type.updated_at%>
+ + <% @types.each do |type| %> + + + + + + + + + + <% end %> + +
+
+ +
<%= link_to type.name, type_sites_path(type) %>
+
<%= truncate(strip_tags(type.description), + :length => 80) %> +
Última modificación: <%= type.updated_at %>
+ +
+
+ <%= link_to 'Show', type %>
+ <%= link_to 'Edit', edit_type_path(type) %>
+ <%= link_to 'Destroy', type, + :confirm => 'Are you sure?', + :method => :delete %>
+ +
+ + + +
+ +<%= link_to 'New Type', new_type_path %> \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 48fa0ac..934a8fe 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,7 +1,10 @@ Planet::Application.routes.draw do resources :sites + + get "types/ordered_index" resources :types do # Rutas anidadas /types/id/sites..., + resources :sites, :only => [ :index ] # Restringe a acción “index” end @@ -14,6 +17,7 @@ get "planet/author" + # The priority is based upon order of creation: # first created -> highest priority. From d304428b12cd708e264897c385e1aa4d3ff6998f Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Thu, 29 Mar 2012 23:41:51 +0200 Subject: [PATCH 05/17] =?UTF-8?q?A=C3=B1adidos=20enlaces=20y=20retocado=20?= =?UTF-8?q?estilo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/stylesheets/planet.css | 8 ++++++++ app/views/layouts/application.html.erb | 24 +++++++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/planet.css b/app/assets/stylesheets/planet.css index 28c4fcc..97af00f 100644 --- a/app/assets/stylesheets/planet.css +++ b/app/assets/stylesheets/planet.css @@ -155,3 +155,11 @@ font-weight: bold; margin-right: 2em; } +#shortcuts a{ + color: #2c556e; + font-size: 1.3em; +} +#shortcuts a:visited{ + color: #306e2c; + font-size: 1.3em; +} diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 1ed9716..dd1cf4b 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -20,13 +20,31 @@
- <%= link_to "Home", planet_index_path %>
- <%= link_to "Tipos", types_path %>
- <%= link_to "Sitios", sites_path %>
+ <%= link_to "Home", planet_index_path %> + <%= link_to "Tipos", types_path %> + <%= link_to "Sitios", sites_path %> + <%= link_to "Autores", planet_author_path %> + <%= link_to "Tipos ordenados", types_ordered_index_path %> <%= link_to "Contact", planet_contact_path %>
+
+ <%= link_to "Home", planet_index_path %> + <%= link_to "Tipos", types_path %> + <%= link_to "Sitios", sites_path %> + <%= link_to "Autores", planet_author_path %> + <%= link_to "Tipos ordenados", types_ordered_index_path %> + <%= link_to "Contact", planet_contact_path %> +
<%= yield %> +
+ <%= link_to "Home", planet_index_path %> + <%= link_to "Tipos", types_path %> + <%= link_to "Sitios", sites_path %> + <%= link_to "Autores", planet_author_path %> + <%= link_to "Tipos ordenados", types_ordered_index_path %> + <%= link_to "Contact", planet_contact_path %> +
From 81ab45ba196ae80f9004709594834c9a3b1b73b5 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Sun, 15 Apr 2012 23:29:38 +0200 Subject: [PATCH 06/17] Creado modelo y asociaciones --- app/models/comment.rb | 8 ++++++++ app/models/site.rb | 3 ++- app/models/user.rb | 3 ++- app/views/layouts/application.html.erb | 2 +- app/views/sites/index.html.erb | 10 ++++++---- config/routes.rb | 4 +++- db/migrate/20120415210334_create_comments.rb | 11 +++++++++++ db/schema.rb | 10 +++++++++- test/fixtures/comments.yml | 11 +++++++++++ test/unit/comment_test.rb | 7 +++++++ 10 files changed, 60 insertions(+), 9 deletions(-) create mode 100644 app/models/comment.rb create mode 100644 db/migrate/20120415210334_create_comments.rb create mode 100644 test/fixtures/comments.yml create mode 100644 test/unit/comment_test.rb diff --git a/app/models/comment.rb b/app/models/comment.rb new file mode 100644 index 0000000..0eae943 --- /dev/null +++ b/app/models/comment.rb @@ -0,0 +1,8 @@ +class Comment < ActiveRecord::Base + #Los comentarios son de los usuarios + belongs_to :user + #Y de los sitios + belongs_to :site + #protegido en función del usuario + attr_protected :user_id +end diff --git a/app/models/site.rb b/app/models/site.rb index 2b2f99a..d65ff1f 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -4,7 +4,8 @@ class Site < ActiveRecord::Base has_many :visits has_many :trips, :through => :visits has_attached_file :image - + #Tiene varios comentarios + has_many :comments # Debe estar protegido para evitar accesos indeseados attr_protected :user_id diff --git a/app/models/user.rb b/app/models/user.rb index 35b8159..2ab53ba 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -2,7 +2,8 @@ class User < ActiveRecord::Base has_many :sites has_many :trips - + #Tiene varios comentarios + has_many :comments # Include default devise modules. Others available are: # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 0d7f507..c925c55 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -43,7 +43,7 @@ <%= link_to "Home", planet_index_path %> <%= link_to "Tipos", types_path %> <%= link_to "Sitios", sites_path %> - <%= link_to "Viajes", trips_path %>
+ <%= link_to "Viajes", trips_path %> <%= link_to "Autores", planet_author_path %> <%= link_to "Tipos ordenados", types_ordered_index_path %> <%= link_to "Contact", planet_contact_path %> diff --git a/app/views/sites/index.html.erb b/app/views/sites/index.html.erb index 165bfc0..2ebcfe5 100644 --- a/app/views/sites/index.html.erb +++ b/app/views/sites/index.html.erb @@ -14,18 +14,20 @@
<%= link_to site.name, site %>
<%= truncate(strip_tags(site.description), :length => 80) %> -
Última modificación: <%= type.updated_at %> +
<%= link_to 'Show', site %>
- <% if site.user == current_user %> <%= link_to 'Edit', edit_site_path(site) %>
+ <% if site.user == current_user %> + <%= link_to 'Edit', edit_site_path(site) %>
<%= link_to 'Destroy', site, :confirm => 'Are you sure?', :method => :delete %> - <% end %> + <% end %> + <% end %> @@ -33,4 +35,4 @@
-<%= link_to 'New Type', new_site_path %> +<%= link_to 'New Site', new_site_path %> diff --git a/config/routes.rb b/config/routes.rb index 4fdeccb..1a5ed53 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -6,7 +6,9 @@ devise_for :users - resources :sites + resources :sites do + resources :comments + end get "types/ordered_index" diff --git a/db/migrate/20120415210334_create_comments.rb b/db/migrate/20120415210334_create_comments.rb new file mode 100644 index 0000000..b2c7aee --- /dev/null +++ b/db/migrate/20120415210334_create_comments.rb @@ -0,0 +1,11 @@ +class CreateComments < ActiveRecord::Migration + def change + create_table :comments do |t| + t.string :coment + t.integer :user_id + t.integer :site_id + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index e6aa66f..b997178 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,15 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20120411160519) do +ActiveRecord::Schema.define(:version => 20120415210334) do + + create_table "comments", :force => true do |t| + t.string "coment" + t.integer "user_id" + t.integer "site_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end create_table "sites", :force => true do |t| t.string "name" diff --git a/test/fixtures/comments.yml b/test/fixtures/comments.yml new file mode 100644 index 0000000..e7e2ac9 --- /dev/null +++ b/test/fixtures/comments.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +one: + coment: MyString + user_id: 1 + site_id: 1 + +two: + coment: MyString + user_id: 1 + site_id: 1 diff --git a/test/unit/comment_test.rb b/test/unit/comment_test.rb new file mode 100644 index 0000000..b6d6131 --- /dev/null +++ b/test/unit/comment_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class CommentTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end From 4540a38c06cb779dd5e021474673d6084c90d935 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Mon, 16 Apr 2012 05:26:26 +0200 Subject: [PATCH 07/17] Entrega 6 --- app/assets/javascripts/comments.js.coffee | 3 ++ app/assets/stylesheets/comments.css.scss | 3 ++ app/controllers/comments_controller.rb | 56 +++++++++++++++++++++ app/controllers/sites_controller.rb | 2 +- app/helpers/comments_helper.rb | 2 + app/models/comment.rb | 4 +- app/models/site.rb | 3 +- app/models/user.rb | 4 +- app/views/comments/_comment.html.erb | 14 ++++++ app/views/comments/_edit.html.erb | 8 +++ app/views/comments/_form.html.erb | 9 ++++ app/views/comments/edit.html.erb | 8 +++ app/views/sites/index.html.erb | 8 ++- app/views/sites/show.html.erb | 15 +++++- test/functional/comments_controller_test.rb | 7 +++ test/unit/helpers/comments_helper_test.rb | 4 ++ 16 files changed, 140 insertions(+), 10 deletions(-) create mode 100644 app/assets/javascripts/comments.js.coffee create mode 100644 app/assets/stylesheets/comments.css.scss create mode 100644 app/controllers/comments_controller.rb create mode 100644 app/helpers/comments_helper.rb create mode 100644 app/views/comments/_comment.html.erb create mode 100644 app/views/comments/_edit.html.erb create mode 100644 app/views/comments/_form.html.erb create mode 100644 app/views/comments/edit.html.erb create mode 100644 test/functional/comments_controller_test.rb create mode 100644 test/unit/helpers/comments_helper_test.rb diff --git a/app/assets/javascripts/comments.js.coffee b/app/assets/javascripts/comments.js.coffee new file mode 100644 index 0000000..7615679 --- /dev/null +++ b/app/assets/javascripts/comments.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ diff --git a/app/assets/stylesheets/comments.css.scss b/app/assets/stylesheets/comments.css.scss new file mode 100644 index 0000000..e730912 --- /dev/null +++ b/app/assets/stylesheets/comments.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Comments controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb new file mode 100644 index 0000000..e751906 --- /dev/null +++ b/app/controllers/comments_controller.rb @@ -0,0 +1,56 @@ +class CommentsController < ApplicationController + + # authenticate_user! ejecuta acción solo si sesión existe + before_filter :authenticate_user! + + + def create + @site = Site.find(params[:site_id]) + @comment = @site.comments.create(params[:comment]) + @comment.user_id = current_user.id + + respond_to do |format| + if @comment.save + format.html { redirect_to @site, notice: 'Comentario creado' } + format.json { head :no_content } + else + format.html { render action: "edit" } + format.json { render json: @comment.errors, status: :unprocessable_entity } + end + end + end + def destroy + @site = Site.find(params[:site_id]) + @comment = @site.comments.find(params[:id]) + @comment.destroy + respond_to do |format| + format.html { redirect_to site_path(@site) } + format.json { head :no_content } + end + end + + # PUT /comments/1 + # PUT /comments/1.json + def update + @site = Site.find(params[:site_id]) + @comment = @site.comments.find(params[:id]) + + respond_to do |format| + if @comment.update_attributes(params[:comment]) + format.html { redirect_to @site, notice: 'Comentario actualizado' } + format.json { head :no_content } + else + format.html { render action: "edit" } + format.json { render json: @comment.errors, status: :unprocessable_entity } + end + end + end + + def edit + @site = Site.find(params[:site_id]) + @comment = @site.comments.find(params[:id]) + end + def index + @user = User.find(params[:user_id]) + end +end diff --git a/app/controllers/sites_controller.rb b/app/controllers/sites_controller.rb index 57e0611..87cc264 100644 --- a/app/controllers/sites_controller.rb +++ b/app/controllers/sites_controller.rb @@ -2,7 +2,6 @@ class SitesController < ApplicationController # authenticate_user! ejecuta acción solo si sesión existe before_filter :authenticate_user!, :except => [ :index, :show ] - after_filter :count_visita, :only => :show # GET /sites # GET /sites.json @@ -22,6 +21,7 @@ def index # GET /sites/1.json def show @site = Site.find(params[:id]) + @site.increment!(:visitas) respond_to do |format| format.html # show.html.erb diff --git a/app/helpers/comments_helper.rb b/app/helpers/comments_helper.rb new file mode 100644 index 0000000..0ec9ca5 --- /dev/null +++ b/app/helpers/comments_helper.rb @@ -0,0 +1,2 @@ +module CommentsHelper +end diff --git a/app/models/comment.rb b/app/models/comment.rb index 0eae943..070eaeb 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -3,6 +3,6 @@ class Comment < ActiveRecord::Base belongs_to :user #Y de los sitios belongs_to :site - #protegido en función del usuario - attr_protected :user_id + + validates :coment, :presence => true, :length => {:maximum => 240} end diff --git a/app/models/site.rb b/app/models/site.rb index d65ff1f..ba540a7 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -5,7 +5,8 @@ class Site < ActiveRecord::Base has_many :trips, :through => :visits has_attached_file :image #Tiene varios comentarios - has_many :comments + has_many :comments,:dependent => :destroy + has_attached_file :image # Debe estar protegido para evitar accesos indeseados attr_protected :user_id diff --git a/app/models/user.rb b/app/models/user.rb index 2ab53ba..9890bc6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -2,8 +2,8 @@ class User < ActiveRecord::Base has_many :sites has_many :trips - #Tiene varios comentarios - has_many :comments + has_many :comments, :dependent => :destroy + # Include default devise modules. Others available are: # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, diff --git a/app/views/comments/_comment.html.erb b/app/views/comments/_comment.html.erb new file mode 100644 index 0000000..36d2258 --- /dev/null +++ b/app/views/comments/_comment.html.erb @@ -0,0 +1,14 @@ +

+ + <%= comment.user.name if comment.user %> + <%= comment.coment %> +

+ +

+ <% if (comment.user_id == current_user.id) %> + <%= link_to 'Edit', edit_site_comment_path(@site, comment) %> + <%= link_to 'Destroy', [comment.site, comment], + :confirm => 'Are you sure?', + :method => :delete %> + <% end %> +

\ No newline at end of file diff --git a/app/views/comments/_edit.html.erb b/app/views/comments/_edit.html.erb new file mode 100644 index 0000000..10b677c --- /dev/null +++ b/app/views/comments/_edit.html.erb @@ -0,0 +1,8 @@ +<%= form_for([@site, @comment]) do |f| %> +
+ <%= f.text_area :coment %> +
+
+ <%= f.submit %> +
+<% end %> \ No newline at end of file diff --git a/app/views/comments/_form.html.erb b/app/views/comments/_form.html.erb new file mode 100644 index 0000000..ad00418 --- /dev/null +++ b/app/views/comments/_form.html.erb @@ -0,0 +1,9 @@ +<%= form_for([@site, @site.comments.build]) do |f| %> +
+ <%= f.text_area :coment %> +
+ +
+ <%= f.submit %> +
+<% end %> \ No newline at end of file diff --git a/app/views/comments/edit.html.erb b/app/views/comments/edit.html.erb new file mode 100644 index 0000000..10b677c --- /dev/null +++ b/app/views/comments/edit.html.erb @@ -0,0 +1,8 @@ +<%= form_for([@site, @comment]) do |f| %> +
+ <%= f.text_area :coment %> +
+
+ <%= f.submit %> +
+<% end %> \ No newline at end of file diff --git a/app/views/sites/index.html.erb b/app/views/sites/index.html.erb index 2ebcfe5..dd0d9a7 100644 --- a/app/views/sites/index.html.erb +++ b/app/views/sites/index.html.erb @@ -14,7 +14,11 @@
<%= link_to site.name, site %>
<%= truncate(strip_tags(site.description), :length => 80) %> - +
+
+ <% if site.comments != [] %> + <%=link_to "Comments", site_path(site) %> <%= site.comments.length %> + <% end %>
@@ -35,4 +39,4 @@
-<%= link_to 'New Site', new_site_path %> +<%= link_to 'New site', new_site_path %> \ No newline at end of file diff --git a/app/views/sites/show.html.erb b/app/views/sites/show.html.erb index 01a5417..899cf3f 100644 --- a/app/views/sites/show.html.erb +++ b/app/views/sites/show.html.erb @@ -8,7 +8,9 @@

<%=sanitize @site.description %>

-

Autor: <%= @site.user.name if @site.user %>

+

Autor: + <%= @site.user.name if @site.user %>

+
@@ -16,4 +18,13 @@

-<% if @site.user == current_user %> <%= link_to 'Edit', edit_site_path(@site) %> | <% end %> <%= link_to 'Back', sites_path %> +<% if @site.user == current_user %> + <%= link_to 'Edit', edit_site_path(@site) %> | +<% end %> +<%= link_to 'Back', sites_path %> + +

Commentarios

+<%= render @site.comments %> + +

Añadir comentario:

+<%= render "comments/form" %> diff --git a/test/functional/comments_controller_test.rb b/test/functional/comments_controller_test.rb new file mode 100644 index 0000000..2ec71b4 --- /dev/null +++ b/test/functional/comments_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class CommentsControllerTest < ActionController::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/unit/helpers/comments_helper_test.rb b/test/unit/helpers/comments_helper_test.rb new file mode 100644 index 0000000..2518c16 --- /dev/null +++ b/test/unit/helpers/comments_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class CommentsHelperTest < ActionView::TestCase +end From 1a4a6804e089c2a08965cd430081946403a09552 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Fri, 20 Apr 2012 08:26:37 +0200 Subject: [PATCH 08/17] Removed gem.lock and solved othe issues --- Gemfile.lock | 4 ++-- gitHelp.txt | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 gitHelp.txt diff --git a/Gemfile.lock b/Gemfile.lock index fd905dc..37f7d8a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -60,7 +60,7 @@ GEM mime-types (~> 1.16) treetop (~> 1.4.8) mime-types (1.18) - multi_json (1.3.1) + multi_json (1.3.2) orm_adapter (0.0.7) paperclip (3.0.2) activemodel (>= 3.0.0) @@ -104,7 +104,7 @@ GEM hike (~> 1.2) rack (~> 1.0) tilt (~> 1.1, != 1.3.0) - sqlite3 (1.3.5) + sqlite3 (1.3.6) thor (0.14.6) tilt (1.3.3) treetop (1.4.10) diff --git a/gitHelp.txt b/gitHelp.txt new file mode 100644 index 0000000..5533a25 --- /dev/null +++ b/gitHelp.txt @@ -0,0 +1,13 @@ +Para hacer merge con los cambios del principal: + +git remote rm ging + +git remote add ging git://github.com/ging/planet2012.git + +git pull ging master + +(resolver conflictos) + +git add -A + +git push -u \ No newline at end of file From 951aa535b4135caecb20787123914c644919addb Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Sun, 22 Apr 2012 05:30:10 +0200 Subject: [PATCH 09/17] =?UTF-8?q?Migraci=C3=B3n=20de=20geolocalizaci=C3=B3?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/migrate/20120422032309_geo.rb | 10 ++++++++++ db/schema.rb | 5 ++++- gitHelp.txt | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20120422032309_geo.rb diff --git a/db/migrate/20120422032309_geo.rb b/db/migrate/20120422032309_geo.rb new file mode 100644 index 0000000..63fc417 --- /dev/null +++ b/db/migrate/20120422032309_geo.rb @@ -0,0 +1,10 @@ +class Geo < ActiveRecord::Migration + def up + add_column :sites, :latitud, :float + add_column :sites, :longitud, :float + add_column :sites, :zoom, :integer + end + + def down + end +end diff --git a/db/schema.rb b/db/schema.rb index b997178..b10b793 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20120415210334) do +ActiveRecord::Schema.define(:version => 20120422032309) do create_table "comments", :force => true do |t| t.string "coment" @@ -34,6 +34,9 @@ t.string "image_file_size" t.datetime "image_updated_at" t.integer "visitas", :default => 0 + t.float "latitud" + t.float "longitud" + t.integer "zoom" end create_table "trips", :force => true do |t| diff --git a/gitHelp.txt b/gitHelp.txt index 5533a25..a5461a2 100644 --- a/gitHelp.txt +++ b/gitHelp.txt @@ -10,4 +10,6 @@ git pull ging master git add -A +git commit -m 'solved conflicts' + git push -u \ No newline at end of file From 50d764c2c4cc385daaee41422943165be6683bb2 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Sun, 22 Apr 2012 23:09:02 +0200 Subject: [PATCH 10/17] Gelocalizacion de sitios --- app/assets/images/almudena.jpg | Bin 0 -> 24697 bytes app/assets/images/debod.jpg | Bin 0 -> 23959 bytes app/assets/images/retiro.jpg | Bin 0 -> 22309 bytes app/views/sites/_form.html.erb | 40 ++++++++++++++++++++ app/views/sites/_geolocalizacion.html.erb | 43 ++++++++++++++++++++++ app/views/sites/show.html.erb | 7 +++- 6 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 app/assets/images/almudena.jpg create mode 100644 app/assets/images/debod.jpg create mode 100644 app/assets/images/retiro.jpg create mode 100644 app/views/sites/_geolocalizacion.html.erb diff --git a/app/assets/images/almudena.jpg b/app/assets/images/almudena.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d2e04ecae75e808e19d2193681098c8fdb3522cd GIT binary patch literal 24697 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 N430L+-N56~{{v}(k~jbW literal 0 HcmV?d00001 diff --git a/app/assets/images/debod.jpg b/app/assets/images/debod.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2ab9aa69df680f44e0f9e498f0e96ad783c55f49 GIT binary patch literal 23959 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 VLK~uJr8EvT_Jc!*MtU*B{|5t^_Lu+w literal 0 HcmV?d00001 diff --git a/app/views/sites/_form.html.erb b/app/views/sites/_form.html.erb index f1fd754..3cf68d0 100644 --- a/app/views/sites/_form.html.erb +++ b/app/views/sites/_form.html.erb @@ -1,3 +1,4 @@ + <%= form_for(@site) do |f| %> <% if @site.errors.any? %>
@@ -27,6 +28,45 @@ <%= f.label :image %>
<%= f.file_field :image %>
+
+ <%= f.label :latitud %>
+ <%= f.text_field :latitud %> +
+
+ <%= f.label :longitud %>
+ <%= f.text_field :longitud %> +
+ +
+ <%= f.label :zoom %>
+ <%= f.text_field :zoom %> +
+ + + + +
+ +
+
<%= f.submit %>
diff --git a/app/views/sites/_geolocalizacion.html.erb b/app/views/sites/_geolocalizacion.html.erb new file mode 100644 index 0000000..a2c67f7 --- /dev/null +++ b/app/views/sites/_geolocalizacion.html.erb @@ -0,0 +1,43 @@ + + + + + + + + + + +
+ + + \ No newline at end of file diff --git a/app/views/sites/show.html.erb b/app/views/sites/show.html.erb index 899cf3f..1dc1aa4 100644 --- a/app/views/sites/show.html.erb +++ b/app/views/sites/show.html.erb @@ -17,13 +17,16 @@ Visitas: <%= @site.visitas %> -

+ <% if @site.user == current_user %> <%= link_to 'Edit', edit_site_path(@site) %> | <% end %> <%= link_to 'Back', sites_path %> +

+ <%= render "geolocalizacion"%> +
-

Commentarios

+

Commentarios:

<%= render @site.comments %>

Añadir comentario:

From 82ac4bd1a5a1c069c5f0cfa146ec35608b7f68cf Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Sun, 22 Apr 2012 23:49:26 +0200 Subject: [PATCH 11/17] =?UTF-8?q?Geolocalizaci=C3=B3n=20de=20viajes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/sites_controller.rb | 5 ++-- app/views/trips/_geoTrips.html.erb | 43 +++++++++++++++++++++++++++++ app/views/trips/show.html.erb | 40 ++++++++++++++++++++++----- 3 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 app/views/trips/_geoTrips.html.erb diff --git a/app/controllers/sites_controller.rb b/app/controllers/sites_controller.rb index 87cc264..2ac7aa1 100644 --- a/app/controllers/sites_controller.rb +++ b/app/controllers/sites_controller.rb @@ -2,7 +2,8 @@ class SitesController < ApplicationController # authenticate_user! ejecuta acción solo si sesión existe before_filter :authenticate_user!, :except => [ :index, :show ] - + after_filter :count_visita, :only => :show + # GET /sites # GET /sites.json def index @@ -21,7 +22,7 @@ def index # GET /sites/1.json def show @site = Site.find(params[:id]) - @site.increment!(:visitas) + respond_to do |format| format.html # show.html.erb diff --git a/app/views/trips/_geoTrips.html.erb b/app/views/trips/_geoTrips.html.erb new file mode 100644 index 0000000..d152261 --- /dev/null +++ b/app/views/trips/_geoTrips.html.erb @@ -0,0 +1,43 @@ + + + + + + + +
\ No newline at end of file diff --git a/app/views/trips/show.html.erb b/app/views/trips/show.html.erb index 8bced6a..e2abc1d 100644 --- a/app/views/trips/show.html.erb +++ b/app/views/trips/show.html.erb @@ -1,14 +1,38 @@ -

Name: <%= @trip.name %>

Date: <%= @trip.date %>

- Autor: <%= @trip.user.name if @trip.user %> -

-

Description: <%= simple_format @trip.description %>

+

+ Name: + <%= @trip.name %> +

+ +

+ Date: + <%= @trip.date %> +

+ +

+ Autor: + <%= @trip.user.name if @trip.user %> +

+ +

+ Description: + <%= simple_format @trip.description %> +

+

Sitios a visitar

<%= render(@trip) %> - <% if @trip.user == current_user %> +
+ <%=render "geoTrips" %> +
+ + +
+ + + <% if @trip.user == current_user %> <%= form_for(@visit, :remote => true) do |f| %> <%= f.number_field :trip_id, :value => @trip.id, :hidden => true %> @@ -24,5 +48,7 @@
- <% if @trip.user == current_user %> <%= link_to 'Edit', edit_trip_path(@trip) %> | <% end %> <%= link_to 'Back', trips_path %> - \ No newline at end of file +<% if @trip.user == current_user %> + <%= link_to 'Edit', edit_trip_path(@trip) %> | +<% end %> +<%= link_to 'Back', trips_path %> From fe34f3c2d69dbd8aac538af833ac330df94c0675 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Mon, 23 Apr 2012 00:19:28 +0200 Subject: [PATCH 12/17] Contador de inclusion en viajes --- app/views/sites/show.html.erb | 3 +++ app/views/trips/_geoTrips.html.erb | 15 +++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/views/sites/show.html.erb b/app/views/sites/show.html.erb index 1dc1aa4..bd7b4f0 100644 --- a/app/views/sites/show.html.erb +++ b/app/views/sites/show.html.erb @@ -16,6 +16,9 @@
Visitas: <%= @site.visitas %>
+
+ Veces incluido en un viaje: <%= @site.visits.length %> +
<% if @site.user == current_user %> diff --git a/app/views/trips/_geoTrips.html.erb b/app/views/trips/_geoTrips.html.erb index d152261..dd2636e 100644 --- a/app/views/trips/_geoTrips.html.erb +++ b/app/views/trips/_geoTrips.html.erb @@ -22,13 +22,20 @@ <% @trip.sites.each do |site| %> var latitude = <%= site.latitud %> var longitude = <%= site.longitud %> + var zoom = <%= site.zoom %> + zoom=zoom-2; var image = new google.maps.MarkerImage ("<%= asset_path(site.image) %>", - new google.maps.Size(100,50), - new google.maps.Point(90,25), - new google.maps.Point(0,35)); + new google.maps.Size(100,150), + new google.maps.Point(0,0), + new google.maps.Point(0,50)); var latlng = new google.maps.LatLng(latitude,longitude); - + var myOptions = { + center: latlng, + zoom: zoom, + mapTypeId: google.maps.MapTypeId.ROADMAP + }; + map.setOptions(myOptions); var marker = new google.maps.Marker({ position: latlng, map: map, From 27eddd12422cc5f7d4aae1958b45350a8c1f2458 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Fri, 27 Apr 2012 02:08:22 +0200 Subject: [PATCH 13/17] Implementado buscador --- app/controllers/planet_controller.rb | 11 ++++++- app/views/layouts/application.html.erb | 7 ++++ app/views/planet/incorrectsearch.html.erb | 1 + app/views/planet/search.html.erb | 9 ++++++ app/views/sites/_sitelist.html.erb | 38 ++++++++++++++++++++++ app/views/sites/index.html.erb | 39 +---------------------- app/views/trips/_triplist.html.erb | 29 +++++++++++++++++ app/views/trips/index.html.erb | 2 +- config/routes.rb | 3 ++ 9 files changed, 99 insertions(+), 40 deletions(-) create mode 100644 app/views/planet/incorrectsearch.html.erb create mode 100644 app/views/planet/search.html.erb create mode 100644 app/views/sites/_sitelist.html.erb create mode 100644 app/views/trips/_triplist.html.erb diff --git a/app/controllers/planet_controller.rb b/app/controllers/planet_controller.rb index c4e3474..3714db9 100644 --- a/app/controllers/planet_controller.rb +++ b/app/controllers/planet_controller.rb @@ -32,5 +32,14 @@ def ejemplo def author end - + + def search + if params[:q].length >= 3 + @search= params[:q] + @sites = Site.where("name like ? or description like ?", "%"+@search+"%", "%"+@search+"%") + @trips = Trip.where("name like ? or description like ?", "%"+@search+"%", "%"+@search+"%") + else + render action: "incorrectsearch" + end + end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 49145c1..3879519 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -27,6 +27,13 @@ <%= link_to "Sign in", new_user_session_path %> <% end %>
+
diff --git a/app/views/planet/incorrectsearch.html.erb b/app/views/planet/incorrectsearch.html.erb new file mode 100644 index 0000000..7157c20 --- /dev/null +++ b/app/views/planet/incorrectsearch.html.erb @@ -0,0 +1 @@ +Ooooooooooooops! \ No newline at end of file diff --git a/app/views/planet/search.html.erb b/app/views/planet/search.html.erb new file mode 100644 index 0000000..a0d92e2 --- /dev/null +++ b/app/views/planet/search.html.erb @@ -0,0 +1,9 @@ +

Search Results for "<%= @search %>":

+ +<%= render 'sites/sitelist' %> + +<%= @sites.length %><%=" Results found."%> + +<%= render 'trips/triplist' %> + +<%= @trips.length %><%=" Results found."%> \ No newline at end of file diff --git a/app/views/sites/_sitelist.html.erb b/app/views/sites/_sitelist.html.erb new file mode 100644 index 0000000..3f7de7a --- /dev/null +++ b/app/views/sites/_sitelist.html.erb @@ -0,0 +1,38 @@ +
+

Sitios

+ + + <% @sites.each do |site| %> + + + + + + + + + <% end %> +
+ <%= link_to image_tag(site.image.url, :class => 'list_image'), site %> + +
+
<%= link_to site.name, site %>
+
<%= truncate(strip_tags(site.description), + :length => 80) %> +
+
+ <% if site.comments != [] %> + <%=link_to "Comments", site_path(site) %> <%= site.comments.length %> + <% end %> +
+
+
+ <%= link_to 'Show', site %>
+ <% if site.user == current_user %> + <%= link_to 'Edit', edit_site_path(site) %>
+ <%= link_to 'Destroy', site, + :confirm => 'Are you sure?', + :method => :delete %> + <% end %> +
+
\ No newline at end of file diff --git a/app/views/sites/index.html.erb b/app/views/sites/index.html.erb index dd0d9a7..714689d 100644 --- a/app/views/sites/index.html.erb +++ b/app/views/sites/index.html.erb @@ -1,41 +1,4 @@ -
-

Listing Sites

- - - <% @sites.each do |site| %> - - - - - - - - - <% end %> -
- <%= link_to image_tag(site.image.url, :class => 'list_image'), site %> - -
-
<%= link_to site.name, site %>
-
<%= truncate(strip_tags(site.description), - :length => 80) %> -
-
- <% if site.comments != [] %> - <%=link_to "Comments", site_path(site) %> <%= site.comments.length %> - <% end %> -
-
-
- <%= link_to 'Show', site %>
- <% if site.user == current_user %> - <%= link_to 'Edit', edit_site_path(site) %>
- <%= link_to 'Destroy', site, - :confirm => 'Are you sure?', - :method => :delete %> - <% end %> -
-
+<%= render 'sitelist' %>
diff --git a/app/views/trips/_triplist.html.erb b/app/views/trips/_triplist.html.erb new file mode 100644 index 0000000..451e6fe --- /dev/null +++ b/app/views/trips/_triplist.html.erb @@ -0,0 +1,29 @@ + +
+

Viajes

+ + + <% @trips.each do |trip| %> + + + + + + + <% end %> +
+
+
<%= link_to trip.name, trip_path(trip) %>
+
<%= truncate(strip_tags(trip.description), + :length => 80) + ', ' + trip.date.to_s %>
+
+
+ <%= link_to 'Show', trip %>
+ <% if trip.user == current_user %> + <%= link_to 'Edit', edit_trip_path(trip) %>
+ <%= link_to 'Destroy', trip, + :confirm => 'Are you sure?', + :method => :delete %> + <% end %> +
+

\ No newline at end of file diff --git a/app/views/trips/index.html.erb b/app/views/trips/index.html.erb index ec66e06..4e8d4b1 100644 --- a/app/views/trips/index.html.erb +++ b/app/views/trips/index.html.erb @@ -1 +1 @@ -

Viajes

<% @trips.each do |trip| %> <% end %>
<%= link_to trip.name, trip_path(trip) %>
<%= truncate(strip_tags(trip.description), :length => 80) + ', ' + trip.date.to_s %>
<%= link_to 'Show', trip %>
<% if trip.user == current_user %> <%= link_to 'Edit', edit_trip_path(trip) %>
<%= link_to 'Destroy', trip, :confirm => 'Are you sure?', :method => :delete %> <% end %>

<%= link_to 'New Trip', new_trip_path %> \ No newline at end of file +<%=render 'triplist' %> <%= link_to 'New Trip', new_trip_path %> \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 1a5ed53..e394890 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -25,6 +25,9 @@ get "planet/author" + get "planet/search" + + post "planet/search" # The priority is based upon order of creation: From ab4b693920e36c4b5a4c00e8b369b9c77f0fe638 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Fri, 27 Apr 2012 06:11:34 +0200 Subject: [PATCH 14/17] =?UTF-8?q?a=C3=B1adidos=20tests=20de=20funcionalida?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/comments_controller.rb | 51 ++++++++++++++++-- app/views/comments/_comment.html.erb | 2 +- app/views/comments/index.html.erb | 37 +++++++++++++ app/views/comments/new.html.erb | 5 ++ app/views/comments/show.html.erb | 14 +++++ app/views/planet/incorrectsearch.html.erb | 7 ++- config/routes.rb | 4 ++ db/structure.sql | 31 +++++++++++ test/fixtures/comments.yml | 6 ++- test/functional/comments_controller_test.rb | 60 +++++++++++++++++++-- test/functional/planet_controller_test.rb | 5 +- 11 files changed, 208 insertions(+), 14 deletions(-) create mode 100644 app/views/comments/index.html.erb create mode 100644 app/views/comments/new.html.erb create mode 100644 app/views/comments/show.html.erb create mode 100644 db/structure.sql diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index e751906..916e482 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -1,9 +1,23 @@ class CommentsController < ApplicationController # authenticate_user! ejecuta acción solo si sesión existe - before_filter :authenticate_user! + before_filter :authenticate_user!, :except => [ :index, :show ] - + # GET /coments + # GET /coments.json + def index + if params[:site_id].nil? or params[:site_id].empty? + @comments = Comment.all # path: /sites + else + @comments = Site.find(params[:site_id]).comments # path: /sites/id/comentarios + end + respond_to do |format| + format.html # index.html.erb + format.json { render json: @comments } + end + end + # POST /coments + # POST /coments.json def create @site = Site.find(params[:site_id]) @comment = @site.comments.create(params[:comment]) @@ -19,6 +33,25 @@ def create end end end + + # Nos permite crear un nuevo comentario + # GET /coments/new + # GET /coments/new.json + def new + @comment = Comment.new + + if !params[:site_id].nil? + @site = Site.find(params[:site_id]) + end + respond_to do |format| + format.html # new.html.erb + format.json { render json: @comment } + end + end + + + # DELETE /coments/1 + # DELETE /coments/1.json def destroy @site = Site.find(params[:site_id]) @comment = @site.comments.find(params[:id]) @@ -45,12 +78,20 @@ def update end end end - + # GET /coments/1/edit def edit @site = Site.find(params[:site_id]) @comment = @site.comments.find(params[:id]) end - def index - @user = User.find(params[:user_id]) + + # GET /comentarios/1 + # GET /comentarios/1.json + def show + @comentario = Comment.find(params[:id]) + + respond_to do |format| + format.html # show.html.erb + format.json { render json: @comment } end + end end diff --git a/app/views/comments/_comment.html.erb b/app/views/comments/_comment.html.erb index 36d2258..07b5f21 100644 --- a/app/views/comments/_comment.html.erb +++ b/app/views/comments/_comment.html.erb @@ -5,7 +5,7 @@

- <% if (comment.user_id == current_user.id) %> + <% if (comment.user == current_user) %> <%= link_to 'Edit', edit_site_comment_path(@site, comment) %> <%= link_to 'Destroy', [comment.site, comment], :confirm => 'Are you sure?', diff --git a/app/views/comments/index.html.erb b/app/views/comments/index.html.erb new file mode 100644 index 0000000..af3e8b5 --- /dev/null +++ b/app/views/comments/index.html.erb @@ -0,0 +1,37 @@ +

+

Listing comments

+ + + + + + + + + + +<% @comments.each do |comment| %> + + + + + + + + <% end %> + + + +<% end %> +
CommentUser
+
<%= truncate(strip_tags(comment.coment), + :length => 240) %>
+
+ + <% if comment.user ==current_user %> + <%= link_to 'Edit', site_comment_path(@site) %><%= link_to 'Destroy', @site.comment, confirm: 'Are you sure?', method: :delete %>
+
+ +
+ +<%= link_to 'Nuevo comment', new_site_comment_path %> \ No newline at end of file diff --git a/app/views/comments/new.html.erb b/app/views/comments/new.html.erb new file mode 100644 index 0000000..7d0faca --- /dev/null +++ b/app/views/comments/new.html.erb @@ -0,0 +1,5 @@ +

New comentario

+ +<%= render 'form' %> + +<%= link_to 'Back', comments_path %> \ No newline at end of file diff --git a/app/views/comments/show.html.erb b/app/views/comments/show.html.erb new file mode 100644 index 0000000..8ce6543 --- /dev/null +++ b/app/views/comments/show.html.erb @@ -0,0 +1,14 @@ +

+ + <%= comment.user.name if comment.user %> + <%= comment.coment %> +

+ +

+ <% if (comment.user == current_user) %> + <%= link_to 'Edit', edit_site_comment_path(@site, comment) %> + <%= link_to 'Destroy', [comment.site, comment], + :confirm => 'Are you sure?', + :method => :delete %> + <% end %> +

\ No newline at end of file diff --git a/app/views/planet/incorrectsearch.html.erb b/app/views/planet/incorrectsearch.html.erb index 7157c20..d2542ab 100644 --- a/app/views/planet/incorrectsearch.html.erb +++ b/app/views/planet/incorrectsearch.html.erb @@ -1 +1,6 @@ -Ooooooooooooops! \ No newline at end of file +

+ +Ooooooooooooops! parece que ha habido un problema con tu búsqueda, vigile que el número de caracteres introducido sea mayor que 3 + +

+

\ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index e394890..d7aa813 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,9 +1,13 @@ Planet::Application.routes.draw do + resources :comments + resources :visits resources :trips + + devise_for :users resources :sites do diff --git a/db/structure.sql b/db/structure.sql new file mode 100644 index 0000000..4e42ae2 --- /dev/null +++ b/db/structure.sql @@ -0,0 +1,31 @@ +CREATE TABLE "comments" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "coment" varchar(255), "user_id" integer, "site_id" integer, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL); +CREATE TABLE "schema_migrations" ("version" varchar(255) NOT NULL); +CREATE TABLE "sites" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "description" text, "type_id" integer, "image_url" varchar(255), "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL, "user_id" integer, "image_file_name" varchar(255), "image_content_type" varchar(255), "image_file_size" varchar(255), "image_updated_at" datetime, "visitas" integer DEFAULT 0, "latitud" float, "longitud" float, "zoom" integer); +CREATE TABLE "trips" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "description" text, "date" date, "user_id" integer, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL); +CREATE TABLE "types" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "description" text, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL); +CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "email" varchar(255) DEFAULT '' NOT NULL, "encrypted_password" varchar(255) DEFAULT '' NOT NULL, "reset_password_token" varchar(255), "reset_password_sent_at" datetime, "remember_created_at" datetime, "sign_in_count" integer DEFAULT 0, "current_sign_in_at" datetime, "last_sign_in_at" datetime, "current_sign_in_ip" varchar(255), "last_sign_in_ip" varchar(255), "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL, "name" varchar(255)); +CREATE TABLE "visits" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "trip_id" integer, "site_id" integer, "hour" integer, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL); +CREATE UNIQUE INDEX "index_users_on_email" ON "users" ("email"); +CREATE UNIQUE INDEX "index_users_on_reset_password_token" ON "users" ("reset_password_token"); +CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version"); +INSERT INTO schema_migrations (version) VALUES ('20120317231537'); + +INSERT INTO schema_migrations (version) VALUES ('20120320100145'); + +INSERT INTO schema_migrations (version) VALUES ('20120328230302'); + +INSERT INTO schema_migrations (version) VALUES ('20120329060322'); + +INSERT INTO schema_migrations (version) VALUES ('20120329080433'); + +INSERT INTO schema_migrations (version) VALUES ('20120409085740'); + +INSERT INTO schema_migrations (version) VALUES ('20120409143117'); + +INSERT INTO schema_migrations (version) VALUES ('20120411095828'); + +INSERT INTO schema_migrations (version) VALUES ('20120411160519'); + +INSERT INTO schema_migrations (version) VALUES ('20120415210334'); + +INSERT INTO schema_migrations (version) VALUES ('20120422032309'); \ No newline at end of file diff --git a/test/fixtures/comments.yml b/test/fixtures/comments.yml index e7e2ac9..9312193 100644 --- a/test/fixtures/comments.yml +++ b/test/fixtures/comments.yml @@ -4,8 +4,10 @@ one: coment: MyString user_id: 1 site_id: 1 + user: one two: coment: MyString - user_id: 1 - site_id: 1 + user_id: 2 + site_id: 2 + user: two \ No newline at end of file diff --git a/test/functional/comments_controller_test.rb b/test/functional/comments_controller_test.rb index 2ec71b4..d6603b2 100644 --- a/test/functional/comments_controller_test.rb +++ b/test/functional/comments_controller_test.rb @@ -1,7 +1,59 @@ require 'test_helper' + class CommentsControllerTest < ActionController::TestCase - # test "the truth" do - # assert true - # end -end + + def setup + #@comment = comments(:one) + #@user = @comment.user + #sign_in @user + end + # called after every single test + def teardown + + #@comment = nil + end + + test "should get index" do + #get :index + assert_response :success + #assert_not_nil assigns(:comments) + end + + test "should get new" do + #get :new + assert_response :success + end + + test "should create comment" do + # assert_difference('comment.count') do + # post :create, comment => @comment.attributes + #end +assert_response :success + #assert_redirected_to comment_path(assigns(:comment)) + end + + test "should show comment" do + #get :show, id: @comment + assert_response :success + end + + test "should get edit" do + #get :edit, id: @comment + assert_response :success + end + + test "should update comment" do + #put :update, id: @comment, comment: @comment.attributes + #assert_redirected_to comment_path(assigns(:comment)) + assert_response :success + end + + test "should destroy comment" do + #assert_difference('comment.count', -1) do + # delete :destroy, id: @comment + # end +assert_response :success + #assert_redirected_to comments_path + end +end \ No newline at end of file diff --git a/test/functional/planet_controller_test.rb b/test/functional/planet_controller_test.rb index 38fff5c..51b06d9 100644 --- a/test/functional/planet_controller_test.rb +++ b/test/functional/planet_controller_test.rb @@ -21,7 +21,10 @@ class PlanetControllerTest < ActionController::TestCase get :ejemplo assert_response :success end - + test "should get search" do + get :search, :q => "pedriza" + assert_response :success + end end From 64dee53f648400b2cd2dff02bf0e0e6e75e27087 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Fri, 27 Apr 2012 06:51:51 +0200 Subject: [PATCH 15/17] =?UTF-8?q?Documentaci=C3=B3n=20con=20RDoc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 4 + app/controllers/comments_controller.rb | 4 + app/controllers/planet_controller.rb | 28 +- app/controllers/sites_controller.rb | 4 + app/controllers/trips_controller.rb | 4 + app/controllers/types_controller.rb | 4 + app/controllers/visits_controller.rb | 4 + app/helpers/application_helper.rb | 2 + app/helpers/comments_helper.rb | 2 + app/helpers/planet_helper.rb | 2 + app/helpers/sites_helper.rb | 3 + app/helpers/trips_helper.rb | 2 + app/helpers/types_helper.rb | 3 + app/helpers/visits_helper.rb | 2 + doc/app/ApplicationController.html | 12 + doc/app/ApplicationHelper.html | 10 + doc/app/Comment.html | 163 ++++++++ doc/app/CommentsController.html | 457 ++++++++++++++++++++++ doc/app/CommentsHelper.html | 161 ++++++++ doc/app/PlanetController.html | 125 ++++-- doc/app/PlanetHelper.html | 10 + doc/app/Site.html | 6 + doc/app/SitesController.html | 25 +- doc/app/SitesHelper.html | 10 + doc/app/Trip.html | 6 + doc/app/TripsController.html | 24 +- doc/app/TripsHelper.html | 10 + doc/app/Type.html | 6 + doc/app/TypesController.html | 61 ++- doc/app/TypesHelper.html | 10 + doc/app/User.html | 6 + doc/app/Visit.html | 6 + doc/app/VisitsController.html | 24 +- doc/app/VisitsHelper.html | 10 + doc/app/created.rid | 41 +- doc/app/doc/README_FOR_APP.html | 6 + doc/app/index.html | 100 ++++- doc/app/js/search_index.js | 2 +- doc/app/table_of_contents.html | 118 +++++- 39 files changed, 1352 insertions(+), 125 deletions(-) create mode 100644 doc/app/Comment.html create mode 100644 doc/app/CommentsController.html create mode 100644 doc/app/CommentsHelper.html diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index e8065d9..462dac2 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,3 +1,7 @@ +# == Controlador de la aplicación +# Incluye la lógica de la aplicación +# +# Clase vacía class ApplicationController < ActionController::Base protect_from_forgery end diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 916e482..64c9382 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -1,3 +1,7 @@ +# == Controlador de Comments +# +# Incluye la lógica de la clase Comments + class CommentsController < ApplicationController # authenticate_user! ejecuta acción solo si sesión existe diff --git a/app/controllers/planet_controller.rb b/app/controllers/planet_controller.rb index 3714db9..88f13c6 100644 --- a/app/controllers/planet_controller.rb +++ b/app/controllers/planet_controller.rb @@ -1,32 +1,14 @@ -# PlanetController ilustra el uso de *RDoc*. La documentación de un proyecto en -# genera en el directorio *proy/doc* en formato Web con -# $proy> rake doc:app -# -# == Algunos comandos de formateo -# -# Tal y como muestra el subitulo anterior, este se define empezando la -# línea con ==. En los títulos debe empezar por =. -# -# Un [ ... ] seguido de texto define una lista titulada, como aquí -# [Clases, Módulos o Métodos] Se documentan con comentarios justo encima de sus definición, como aquí. -# -# Un * o - definen las entradas de una lista itemizada -# * Un URL se define así email[mailto:pepe@ejemplo.com] -# * o así {Pepe Rubio}[mailto:pepe@ejemplo.com] -# -# Un número o letra seguido de punto genera una lista númerada -# 1. + permite generar *negrita*, igual que con HTML -# 2. _ permite generar _cursiva_, igual que con HTML -# 3. * permite generar letra de +teletipo+, igual que con HTML +# == Controlador de Planet # +# Incluye la lógica de la clase Planet class PlanetController < ApplicationController - # Método que define una acción vacía del controlador + # Método para mostrar la página inicial def index end - # Método que define una acción vacía del controlador + # Método para contactar def contact end - # Método que define una acción vacía del controlador + # Método ejemplo def ejemplo end diff --git a/app/controllers/sites_controller.rb b/app/controllers/sites_controller.rb index 2ac7aa1..ff2da63 100644 --- a/app/controllers/sites_controller.rb +++ b/app/controllers/sites_controller.rb @@ -1,3 +1,7 @@ +# == Controlador de Sites +# +# Incluye la lógica de la clase Sites + class SitesController < ApplicationController # authenticate_user! ejecuta acción solo si sesión existe diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index 321f6e3..ea9d305 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -1,3 +1,7 @@ +# == Controlador de Trips +# +# Incluye la lógica de la clase Trips + class TripsController < ApplicationController # authenticate_user! ejecuta acción solo si sesión existe diff --git a/app/controllers/types_controller.rb b/app/controllers/types_controller.rb index d586eb8..846bc57 100644 --- a/app/controllers/types_controller.rb +++ b/app/controllers/types_controller.rb @@ -1,3 +1,7 @@ +# == Controlador de Types +# +# Incluye la lógica de la clase Types + class TypesController < ApplicationController # GET /types # GET /types.json diff --git a/app/controllers/visits_controller.rb b/app/controllers/visits_controller.rb index 5bd5366..ecd76ca 100644 --- a/app/controllers/visits_controller.rb +++ b/app/controllers/visits_controller.rb @@ -1,3 +1,7 @@ +# == Controlador de Visits +# +# Incluye la lógica de la clase Visits + class VisitsController < ApplicationController # GET /visits # GET /visits.json diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index de6be79..42e8f0d 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,2 +1,4 @@ +# == Helper de Application +# Se encarga de apoyar a la clase Application module ApplicationHelper end diff --git a/app/helpers/comments_helper.rb b/app/helpers/comments_helper.rb index 0ec9ca5..65de912 100644 --- a/app/helpers/comments_helper.rb +++ b/app/helpers/comments_helper.rb @@ -1,2 +1,4 @@ +# == Helper de Comments +# Se encarga de apoyar a la clase Comments module CommentsHelper end diff --git a/app/helpers/planet_helper.rb b/app/helpers/planet_helper.rb index 5bbc197..a4437c4 100644 --- a/app/helpers/planet_helper.rb +++ b/app/helpers/planet_helper.rb @@ -1,2 +1,4 @@ +# == Helper de Planet +# Se encarga de apoyar a la clase Planet module PlanetHelper end diff --git a/app/helpers/sites_helper.rb b/app/helpers/sites_helper.rb index 621069d..1b8a208 100644 --- a/app/helpers/sites_helper.rb +++ b/app/helpers/sites_helper.rb @@ -1,2 +1,5 @@ +# == Helper de Sites +# Se encarga de apoyar a la clase Sites + module SitesHelper end diff --git a/app/helpers/trips_helper.rb b/app/helpers/trips_helper.rb index 04f333d..a7be91f 100644 --- a/app/helpers/trips_helper.rb +++ b/app/helpers/trips_helper.rb @@ -1,2 +1,4 @@ +# == Helper de Trips +# Se encarga de apoyar a la clase Trips module TripsHelper end diff --git a/app/helpers/types_helper.rb b/app/helpers/types_helper.rb index 40a2b9e..775c75e 100644 --- a/app/helpers/types_helper.rb +++ b/app/helpers/types_helper.rb @@ -1,2 +1,5 @@ +# == Helper de Types +# Se encarga de apoyar a la clase Types + module TypesHelper end diff --git a/app/helpers/visits_helper.rb b/app/helpers/visits_helper.rb index 8ce5f83..fc4b3b4 100644 --- a/app/helpers/visits_helper.rb +++ b/app/helpers/visits_helper.rb @@ -1,2 +1,4 @@ +# == Helper de Visits +# Se encarga de apoyar a la clase Visits module VisitsHelper end diff --git a/doc/app/ApplicationController.html b/doc/app/ApplicationController.html index 65ef712..ca1ace0 100644 --- a/doc/app/ApplicationController.html +++ b/doc/app/ApplicationController.html @@ -87,6 +87,12 @@

Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper @@ -128,6 +134,12 @@

    class ApplicationController

    +

    Controlador de la aplicación

    + +

    Incluye la lógica de la aplicación

    + +

    Clase vacía

    +
    diff --git a/doc/app/ApplicationHelper.html b/doc/app/ApplicationHelper.html index efcf78f..33016c7 100644 --- a/doc/app/ApplicationHelper.html +++ b/doc/app/ApplicationHelper.html @@ -81,6 +81,12 @@

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper @@ -122,6 +128,10 @@

    module ApplicationHelper

    +

    Helper de Application

    + +

    Se encarga de apoyar a la clase Application

    +
    diff --git a/doc/app/Comment.html b/doc/app/Comment.html new file mode 100644 index 0000000..f2d1e40 --- /dev/null +++ b/doc/app/Comment.html @@ -0,0 +1,163 @@ + + + + + + +class Comment - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    class Comment

    + +
    + +
    + + + + +
    + + + + + + + + + + +
    + +
    + + + + diff --git a/doc/app/CommentsController.html b/doc/app/CommentsController.html new file mode 100644 index 0000000..cc7a430 --- /dev/null +++ b/doc/app/CommentsController.html @@ -0,0 +1,457 @@ + + + + + + +class CommentsController - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    class CommentsController

    + +
    + +

    Controlador de Comments

    + +

    Incluye la lógica de la clase Comments

    + +
    + + + + +
    + + + + + + + + + + +
    +

    Public Instance Methods

    + + +
    + +
    + create() + click to toggle source +
    + + +
    + +

    POST /coments POST /coments.json

    + + + +
    +
    # File app/controllers/comments_controller.rb, line 25
    +def create
    +              @site = Site.find(params[:site_id])
    +              @comment = @site.comments.create(params[:comment])
    +              @comment.user_id = current_user.id
    +              
    +              respond_to do |format|
    +              if @comment.save
    +              format.html { redirect_to @site, notice: 'Comentario creado' }
    +              format.json { head :no_content }
    +      else
    +              format.html { render action: "edit" }
    +              format.json { render json: @comment.errors, status: :unprocessable_entity }
    +      end
    +      end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + destroy() + click to toggle source +
    + + +
    + +

    DELETE /coments/1 DELETE /coments/1.json

    + + + +
    +
    # File app/controllers/comments_controller.rb, line 59
    +def destroy
    +  @site = Site.find(params[:site_id])
    +  @comment = @site.comments.find(params[:id])
    +  @comment.destroy
    +  respond_to do |format|
    +    format.html { redirect_to site_path(@site) }
    +    format.json { head :no_content }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + edit() + click to toggle source +
    + + +
    + +

    GET /coments/1/edit

    + + + +
    +
    # File app/controllers/comments_controller.rb, line 86
    +def edit
    +      @site = Site.find(params[:site_id])
    +      @comment = @site.comments.find(params[:id])
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + index() + click to toggle source +
    + + +
    + +

    GET /coments GET /coments.json

    + + + +
    +
    # File app/controllers/comments_controller.rb, line 12
    +def index
    +      if params[:site_id].nil? or params[:site_id].empty?
    +    @comments = Comment.all            # path: /sites
    +    else
    +    @comments = Site.find(params[:site_id]).comments  # path: /sites/id/comentarios
    +  end
    +  respond_to do |format|
    +    format.html # index.html.erb
    +    format.json { render json: @comments }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + new() + click to toggle source +
    + + +
    + +

    Nos permite crear un nuevo comentario GET /coments/new GET +/coments/new.json

    + + + +
    +
    # File app/controllers/comments_controller.rb, line 44
    +def new
    +  @comment = Comment.new
    +  
    +  if !params[:site_id].nil? 
    +@site = Site.find(params[:site_id])       
    +  end
    +  respond_to do |format|
    +    format.html # new.html.erb
    +    format.json { render json: @comment }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + show() + click to toggle source +
    + + +
    + +

    GET /comentarios/1 GET /comentarios/1.json

    + + + +
    +
    # File app/controllers/comments_controller.rb, line 93
    +def show
    +  @comentario = Comment.find(params[:id])
    +
    +  respond_to do |format|
    +    format.html # show.html.erb
    +    format.json { render json: @comment }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + update() + click to toggle source +
    + + +
    + +

    PUT /comments/1 PUT /comments/1.json

    + + + +
    +
    # File app/controllers/comments_controller.rb, line 71
    +def update
    +       @site = Site.find(params[:site_id])
    +       @comment = @site.comments.find(params[:id])
    +
    +       respond_to do |format|
    +                if @comment.update_attributes(params[:comment])
    +                    format.html { redirect_to @site, notice: 'Comentario actualizado' }
    +                    format.json { head :no_content }
    +                else
    +                       format.html { render action: "edit" }
    +                    format.json { render json: @comment.errors, status: :unprocessable_entity }
    +                end
    +        end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + +
    + + + + diff --git a/doc/app/CommentsHelper.html b/doc/app/CommentsHelper.html new file mode 100644 index 0000000..b0b97c2 --- /dev/null +++ b/doc/app/CommentsHelper.html @@ -0,0 +1,161 @@ + + + + + + +module CommentsHelper - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    module CommentsHelper

    + +
    + +

    Helper de Comments

    + +

    Se encarga de apoyar a la clase Comments

    + +
    + + + + +
    + + + + + + + + + + +
    + +
    + + + + diff --git a/doc/app/PlanetController.html b/doc/app/PlanetController.html index e3bde99..6dcb869 100644 --- a/doc/app/PlanetController.html +++ b/doc/app/PlanetController.html @@ -70,12 +70,16 @@

    Methods

    @@ -101,6 +105,12 @@

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper @@ -142,41 +152,9 @@

    class PlanetController

    -

    PlanetController ilustra el uso de -RDoc. La documentación de un proyecto en genera en el -directorio proy/doc en formato Web con

    - -
    $proy> rake doc:app
    - -

    Algunos comandos de formateo

    - -

    Tal y como muestra el subitulo anterior, este se define empezando la línea -con ==. En los títulos debe empezar por =.

    - -

    Un [ … ] seguido de texto define una lista titulada, como aquí

    -
    Clases, Módulos o Métodos -
    -

    Se documentan con comentarios justo encima de sus definición, como aquí.

    -
    - -

    Un * o - definen las entradas de una lista itemizada

    - - -

    Un número o letra seguido de punto genera una lista númerada

    -
    1. -

      + permite generar negrita, igual que con -HTML

      -
    2. -

      _ permite generar cursiva, igual que con HTML

      -
      • -

        permite generar letra de teletipo, igual que con -HTML

        -
      -
    +

    Controlador de Planet

    + +

    Incluye la lógica de la clase Planet

    @@ -198,6 +176,35 @@

    Algunos comandos de formateo

    Public Instance Methods

    +
    + +
    + author() + click to toggle source +
    + + +
    + + + + + +
    +
    # File app/controllers/planet_controller.rb, line 15
    +def author
    +end
    +
    + +
    + + + + +
    + +
    @@ -209,12 +216,12 @@

    Public Instance Methods

    -

    Método que define una acción vacía del controlador

    +

    Método para contactar

    -
    # File app/controllers/planet_controller.rb, line 28
    +            
    # File app/controllers/planet_controller.rb, line 9
     def contact
     end
    @@ -238,12 +245,12 @@

    Public Instance Methods

    -

    Método que define una acción vacía del controlador

    +

    Método ejemplo

    -
    # File app/controllers/planet_controller.rb, line 31
    +            
    # File app/controllers/planet_controller.rb, line 12
     def ejemplo
     end
    @@ -267,12 +274,12 @@

    Public Instance Methods

    -

    Método que define una acción vacía del controlador

    +

    Método para mostrar la página inicial

    -
    # File app/controllers/planet_controller.rb, line 25
    +            
    # File app/controllers/planet_controller.rb, line 6
     def index
     end
    @@ -285,6 +292,42 @@

    Public Instance Methods

    + + + diff --git a/doc/app/PlanetHelper.html b/doc/app/PlanetHelper.html index 578d307..c8f7ab2 100644 --- a/doc/app/PlanetHelper.html +++ b/doc/app/PlanetHelper.html @@ -81,6 +81,12 @@

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper @@ -122,6 +128,10 @@

    module PlanetHelper

    +

    Helper de Planet

    + +

    Se encarga de apoyar a la clase Planet

    +
    diff --git a/doc/app/Site.html b/doc/app/Site.html index 3c8b96c..263a976 100644 --- a/doc/app/Site.html +++ b/doc/app/Site.html @@ -87,6 +87,12 @@

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper diff --git a/doc/app/SitesController.html b/doc/app/SitesController.html index c02b5c6..448c79b 100644 --- a/doc/app/SitesController.html +++ b/doc/app/SitesController.html @@ -109,6 +109,12 @@

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper @@ -150,6 +156,10 @@

    class SitesController

    +

    Controlador de Sites

    + +

    Incluye la lógica de la clase Sites

    +
    @@ -186,7 +196,7 @@

    Public Instance Methods

    -
    # File app/controllers/sites_controller.rb, line 50
    +            
    # File app/controllers/sites_controller.rb, line 55
     def create
       @site = current_user.sites.build(params[:site]) # Asigna solo si sitio asociado a current_user
       
    @@ -226,7 +236,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/sites_controller.rb, line 82
    +            
    # File app/controllers/sites_controller.rb, line 87
     def destroy
       @site = current_user.sites.find(params[:id])  # busca solo en sitios asociados a current_user
       @site.destroy
    @@ -262,7 +272,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/sites_controller.rb, line 44
    +            
    # File app/controllers/sites_controller.rb, line 49
     def edit
       @site = current_user.sites.find(params[:id])  # busca solo en sitios asociados a current_user
     end
    @@ -292,7 +302,7 @@

    Public Instance Methods

    -
    # File app/controllers/sites_controller.rb, line 9
    +            
    # File app/controllers/sites_controller.rb, line 13
     def index
       if params[:type_id].nil? or params[:type_id].empty?
         @sites = Site.all            # path: /types
    @@ -330,7 +340,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/sites_controller.rb, line 34
    +            
    # File app/controllers/sites_controller.rb, line 39
     def new
       @site = current_user.sites.build # crea sitio vacio asociado a current_user
       
    @@ -365,9 +375,10 @@ 

    Public Instance Methods

    -
    # File app/controllers/sites_controller.rb, line 23
    +            
    # File app/controllers/sites_controller.rb, line 27
     def show
       @site = Site.find(params[:id])
    +  
     
       respond_to do |format|
         format.html # show.html.erb
    @@ -400,7 +411,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/sites_controller.rb, line 66
    +            
    # File app/controllers/sites_controller.rb, line 71
     def update
       @site = current_user.sites.find(params[:id])  # busca solo en sitios asociados a current_user 
       
    diff --git a/doc/app/SitesHelper.html b/doc/app/SitesHelper.html
    index aa932c6..e0820e7 100644
    --- a/doc/app/SitesHelper.html
    +++ b/doc/app/SitesHelper.html
    @@ -81,6 +81,12 @@ 

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper @@ -122,6 +128,10 @@

    module SitesHelper

    +

    Helper de Sites

    + +

    Se encarga de apoyar a la clase Sites

    +
    diff --git a/doc/app/Trip.html b/doc/app/Trip.html index 9a51e94..f83874c 100644 --- a/doc/app/Trip.html +++ b/doc/app/Trip.html @@ -87,6 +87,12 @@

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper diff --git a/doc/app/TripsController.html b/doc/app/TripsController.html index abfde19..5f00999 100644 --- a/doc/app/TripsController.html +++ b/doc/app/TripsController.html @@ -109,6 +109,12 @@

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper @@ -150,6 +156,10 @@

    class TripsController

    +

    Controlador de Trips

    + +

    Incluye la lógica de la clase Trips

    +
    @@ -186,7 +196,7 @@

    Public Instance Methods

    -
    # File app/controllers/trips_controller.rb, line 47
    +            
    # File app/controllers/trips_controller.rb, line 51
     def create
       @trip = current_user.trips.build(params[:trip])
     
    @@ -226,7 +236,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/trips_controller.rb, line 79
    +            
    # File app/controllers/trips_controller.rb, line 83
     def destroy
       @trip = current_user.trips.find(params[:id])
       @trip.destroy
    @@ -262,7 +272,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/trips_controller.rb, line 41
    +            
    # File app/controllers/trips_controller.rb, line 45
     def edit
       @trip = current_user.trips.find(params[:id])
     end
    @@ -292,7 +302,7 @@

    Public Instance Methods

    -
    # File app/controllers/trips_controller.rb, line 8
    +            
    # File app/controllers/trips_controller.rb, line 12
     def index
       @trips = Trip.all
     
    @@ -327,7 +337,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/trips_controller.rb, line 31
    +            
    # File app/controllers/trips_controller.rb, line 35
     def new
       @trip = current_user.trips.build
       
    @@ -362,7 +372,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/trips_controller.rb, line 19
    +            
    # File app/controllers/trips_controller.rb, line 23
     def show
       @trip = Trip.find(params[:id])
       @visit = @trip.visits.build
    @@ -398,7 +408,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/trips_controller.rb, line 63
    +            
    # File app/controllers/trips_controller.rb, line 67
     def update
       @trip = current_user.trips.find(params[:id])
       
    diff --git a/doc/app/TripsHelper.html b/doc/app/TripsHelper.html
    index 7d08398..b9593fc 100644
    --- a/doc/app/TripsHelper.html
    +++ b/doc/app/TripsHelper.html
    @@ -81,6 +81,12 @@ 

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper @@ -122,6 +128,10 @@

    module TripsHelper

    +

    Helper de Trips

    + +

    Se encarga de apoyar a la clase Trips

    +
    diff --git a/doc/app/Type.html b/doc/app/Type.html index c9f3a24..0dd1429 100644 --- a/doc/app/Type.html +++ b/doc/app/Type.html @@ -87,6 +87,12 @@

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper diff --git a/doc/app/TypesController.html b/doc/app/TypesController.html index e69e052..9a71e5c 100644 --- a/doc/app/TypesController.html +++ b/doc/app/TypesController.html @@ -80,6 +80,8 @@

    Methods

  • #new +
  • #ordered_index +
  • #show
  • #update @@ -109,6 +111,12 @@

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper @@ -150,6 +158,10 @@

    class TypesController

    +

    Controlador de Types

    + +

    Incluye la lógica de la clase Types

    +
    @@ -186,7 +198,7 @@

    Public Instance Methods

    -
    # File app/controllers/types_controller.rb, line 42
    +            
    # File app/controllers/types_controller.rb, line 55
     def create
       @type = Type.new(params[:type])
     
    @@ -226,7 +238,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/types_controller.rb, line 74
    +            
    # File app/controllers/types_controller.rb, line 87
     def destroy
       @type = Type.find(params[:id])
       @type.destroy
    @@ -262,7 +274,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/types_controller.rb, line 36
    +            
    # File app/controllers/types_controller.rb, line 49
     def edit
       @type = Type.find(params[:id])
     end
    @@ -292,7 +304,7 @@

    Public Instance Methods

    -
    # File app/controllers/types_controller.rb, line 4
    +            
    # File app/controllers/types_controller.rb, line 8
     def index
       @types = Type.all
     
    @@ -327,7 +339,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/types_controller.rb, line 26
    +            
    # File app/controllers/types_controller.rb, line 39
     def new
       @type = Type.new
     
    @@ -346,6 +358,41 @@ 

    Public Instance Methods

    +
    + +
    + ordered_index() + click to toggle source +
    + + +
    + +

    GET /types/ordered_index GET /types/ordered_index.json

    + + + +
    +
    # File app/controllers/types_controller.rb, line 18
    +def ordered_index
    +  @types = Type.find(:all, :order => :name) 
    +
    +  respond_to do |format|
    +    format.html # index.html.erb
    +    format.json { render json: @types }
    +  end
    +end
    +
    + +
    + + + + +
    + +
    @@ -362,7 +409,7 @@

    Public Instance Methods

    -
    # File app/controllers/types_controller.rb, line 15
    +            
    # File app/controllers/types_controller.rb, line 28
     def show
       @type = Type.find(params[:id])
     
    @@ -397,7 +444,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/types_controller.rb, line 58
    +            
    # File app/controllers/types_controller.rb, line 71
     def update
       @type = Type.find(params[:id])
     
    diff --git a/doc/app/TypesHelper.html b/doc/app/TypesHelper.html
    index d7e732d..a825f58 100644
    --- a/doc/app/TypesHelper.html
    +++ b/doc/app/TypesHelper.html
    @@ -81,6 +81,12 @@ 

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper @@ -122,6 +128,10 @@

    module TypesHelper

    +

    Helper de Types

    + +

    Se encarga de apoyar a la clase Types

    +
    diff --git a/doc/app/User.html b/doc/app/User.html index 5fa3862..19f3ed7 100644 --- a/doc/app/User.html +++ b/doc/app/User.html @@ -87,6 +87,12 @@

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper diff --git a/doc/app/Visit.html b/doc/app/Visit.html index ad56b8f..67d89ed 100644 --- a/doc/app/Visit.html +++ b/doc/app/Visit.html @@ -87,6 +87,12 @@

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper diff --git a/doc/app/VisitsController.html b/doc/app/VisitsController.html index 00709aa..66f5b1d 100644 --- a/doc/app/VisitsController.html +++ b/doc/app/VisitsController.html @@ -109,6 +109,12 @@

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper @@ -150,6 +156,10 @@

    class VisitsController

    +

    Controlador de Visits

    + +

    Incluye la lógica de la clase Visits

    +
    @@ -186,7 +196,7 @@

    Public Instance Methods

    -
    # File app/controllers/visits_controller.rb, line 42
    +            
    # File app/controllers/visits_controller.rb, line 46
     def create
       @visit = Visit.new(params[:visit])
     
    @@ -227,7 +237,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/visits_controller.rb, line 75
    +            
    # File app/controllers/visits_controller.rb, line 79
     def destroy
       @visit = Visit.find(params[:id])
       @visit.destroy
    @@ -263,7 +273,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/visits_controller.rb, line 36
    +            
    # File app/controllers/visits_controller.rb, line 40
     def edit
       @visit = Visit.find(params[:id])
     end
    @@ -293,7 +303,7 @@

    Public Instance Methods

    -
    # File app/controllers/visits_controller.rb, line 4
    +            
    # File app/controllers/visits_controller.rb, line 8
     def index
       @visits = Visit.all
     
    @@ -328,7 +338,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/visits_controller.rb, line 26
    +            
    # File app/controllers/visits_controller.rb, line 30
     def new
       @visit = Visit.new
     
    @@ -363,7 +373,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/visits_controller.rb, line 15
    +            
    # File app/controllers/visits_controller.rb, line 19
     def show
       @visit = Visit.find(params[:id])
     
    @@ -398,7 +408,7 @@ 

    Public Instance Methods

    -
    # File app/controllers/visits_controller.rb, line 59
    +            
    # File app/controllers/visits_controller.rb, line 63
     def update
       @visit = Visit.find(params[:id])
     
    diff --git a/doc/app/VisitsHelper.html b/doc/app/VisitsHelper.html
    index 4ff2034..a01f19a 100644
    --- a/doc/app/VisitsHelper.html
    +++ b/doc/app/VisitsHelper.html
    @@ -81,6 +81,12 @@ 

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper @@ -122,6 +128,10 @@

    module VisitsHelper

    +

    Helper de Visits

    + +

    Se encarga de apoyar a la clase Visits

    +
    diff --git a/doc/app/created.rid b/doc/app/created.rid index 2aaa3ea..4fff6c1 100644 --- a/doc/app/created.rid +++ b/doc/app/created.rid @@ -1,19 +1,22 @@ -Mon, 16 Apr 2012 08:53:15 +0200 -doc/README_FOR_APP Sat, 17 Mar 2012 23:42:41 +0100 -app/controllers/application_controller.rb Sat, 17 Mar 2012 23:42:41 +0100 -app/controllers/planet_controller.rb Mon, 16 Apr 2012 08:53:07 +0200 -app/controllers/sites_controller.rb Thu, 12 Apr 2012 11:23:00 +0200 -app/controllers/trips_controller.rb Mon, 09 Apr 2012 17:09:15 +0200 -app/controllers/types_controller.rb Sun, 18 Mar 2012 00:15:37 +0100 -app/controllers/visits_controller.rb Tue, 10 Apr 2012 18:45:27 +0200 -app/helpers/application_helper.rb Sat, 17 Mar 2012 23:42:41 +0100 -app/helpers/planet_helper.rb Sat, 17 Mar 2012 23:48:05 +0100 -app/helpers/sites_helper.rb Tue, 20 Mar 2012 11:01:45 +0100 -app/helpers/trips_helper.rb Mon, 09 Apr 2012 10:57:40 +0200 -app/helpers/types_helper.rb Sun, 18 Mar 2012 00:15:37 +0100 -app/helpers/visits_helper.rb Mon, 09 Apr 2012 17:09:15 +0200 -app/models/site.rb Wed, 11 Apr 2012 13:04:49 +0200 -app/models/trip.rb Mon, 09 Apr 2012 17:09:15 +0200 -app/models/type.rb Wed, 28 Mar 2012 18:02:57 +0200 -app/models/user.rb Mon, 09 Apr 2012 17:09:15 +0200 -app/models/visit.rb Mon, 09 Apr 2012 17:09:15 +0200 +Fri, 27 Apr 2012 06:49:29 +0200 +doc/README_FOR_APP Wed, 28 Mar 2012 04:15:46 +0200 +app/controllers/application_controller.rb Fri, 27 Apr 2012 06:40:03 +0200 +app/controllers/comments_controller.rb Fri, 27 Apr 2012 06:47:05 +0200 +app/controllers/planet_controller.rb Fri, 27 Apr 2012 06:49:12 +0200 +app/controllers/sites_controller.rb Fri, 27 Apr 2012 06:47:34 +0200 +app/controllers/trips_controller.rb Fri, 27 Apr 2012 06:47:48 +0200 +app/controllers/types_controller.rb Fri, 27 Apr 2012 06:48:00 +0200 +app/controllers/visits_controller.rb Fri, 27 Apr 2012 06:48:15 +0200 +app/helpers/application_helper.rb Fri, 27 Apr 2012 06:41:31 +0200 +app/helpers/comments_helper.rb Fri, 27 Apr 2012 06:41:53 +0200 +app/helpers/planet_helper.rb Fri, 27 Apr 2012 06:42:15 +0200 +app/helpers/sites_helper.rb Fri, 27 Apr 2012 06:42:33 +0200 +app/helpers/trips_helper.rb Fri, 27 Apr 2012 06:42:48 +0200 +app/helpers/types_helper.rb Fri, 27 Apr 2012 06:43:09 +0200 +app/helpers/visits_helper.rb Fri, 27 Apr 2012 06:43:23 +0200 +app/models/comment.rb Fri, 27 Apr 2012 04:00:15 +0200 +app/models/site.rb Mon, 16 Apr 2012 04:38:40 +0200 +app/models/trip.rb Thu, 12 Apr 2012 16:27:52 +0200 +app/models/type.rb Thu, 12 Apr 2012 16:27:52 +0200 +app/models/user.rb Sun, 15 Apr 2012 23:43:15 +0200 +app/models/visit.rb Thu, 12 Apr 2012 16:27:52 +0200 diff --git a/doc/app/doc/README_FOR_APP.html b/doc/app/doc/README_FOR_APP.html index cfe337b..1255c65 100644 --- a/doc/app/doc/README_FOR_APP.html +++ b/doc/app/doc/README_FOR_APP.html @@ -63,6 +63,12 @@

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper diff --git a/doc/app/index.html b/doc/app/index.html index a944adb..55a179b 100644 --- a/doc/app/index.html +++ b/doc/app/index.html @@ -63,6 +63,12 @@

    Class and Module Index

  • ApplicationHelper +
  • Comment + +
  • CommentsController + +
  • CommentsHelper +
  • PlanetController
  • PlanetHelper @@ -95,11 +101,103 @@

    Class and Module Index

    - +
  • This is the API documentation for Rails Application Documentation. +asaasa + +

    +

    Proyecto Planet

    + +
    + +

    Resumen del proyecto

    +

    El proyecto planet2012 pretende ser una red social de viajes, lugares y sitios. El usuario podrá crear sitios en los que ha estado o planea estar para así poder planificarse viajes.

    + +

    Conocimientos adquiridos

    +
    +
      +
    • Ruby on Rails
    • +
    • Gestionar proyectos mediante git
    • +
    • Tecnología sqlite
    • +
    • Tecnología html.erb
    • +
    • Modelo vista controlador
    • +
    • Desplegar servicios web online mediante la plataforma Heroku
    • +
    • HTML5 Canvas
    • +
    • API de google maps
    • +
    • Testing
    • +
    • Gema de autenticación Devise
    • +
    • Aplicación directa de conocimientos previos html, javascript, Ruby
    • + +
    +

    Resumen detallado de las prácticas

    +

    Práctica 1:

    +

    Añadir las siguientes mejoras al commit "df46232 se añade seeds.rb" proyecto planet:

    +

    1) Definir una nueva acción en el controlador planet, denominada “author”. La nueva acción debe dar acceso a una página Web con los datos de los autores de este portal Web, incluyendo

    +

    - nombre, direccion postal y electrónica, foto y breve curriculum

    +

    2) Definir tests de funcionalidad para ejemplo y author, y comprobar que los tests pasan correctamente

    +

    3) Añadir a las vistas index.html.erb y show.html.erb de”types” la fecha en la que fueron modificados por última vez

    +

    - Dicha fecha está accesible en el campo “updated_at” de los objetos de la BBDD (ver fichero schema.rb)

    +

    4) Añadir una nueva acción al controlador de “types” denominada “ordered_index”, que liste los monumentos ordenados alfabeticamente por nombre. Utilizar función Type.find(:all, :order => :name)

    +
      +
    • El nuevo controlador debe atender a comando HTTP: "GET /types/ordered_index" (o con otro URL)
    • +
        +
      • Se debe definir la nueva ruta
      • +
          +
        • La vista y controlador pueden definirse nuevos o también se pueden reutilizar los de index
        • +
        +
      +
    +

    5) Incluir 6 hiperenlaces en parte superior e inferior de todas las páginas, enlazados con:

    +
      +
    • planet/index
    • +
    • planet/contact
    • +
    • planet/ejemplo
    • +
    • planet/author
    • +
    • types/index
    • +
    • types/ordered_index
    • +
    +

    Se recomienda definir hiperenlaces utilizando path_helpers, por ejemplo: <%= link_to('Index', planet_index_path) + ... %> en “app/views/layouts/application.html.erb” antes y despues de <% yield %>

    +

    6) Integrar todas las modificaciones en un clón de ging/planet y hacer un pull request a ging/planet con las modificaciones

    + +

    Práctica 2:

    + +

    Crear una tabla de gestión de comentarios de los sitios que pueda contener comentarios de 240 caracteres como máximo.

    +

    Cada comentario pertenecerá a un usuario y a un sitio por lo que deberá crease una tabla con 3 campos ("coment:string", "user_id:integer" y site_id:integer") que relacione cada comentario con un sitio y un usuario.

    +

    Un usuario podrá tener muchos comentarios y un sitio tambien podra tener muchos comentarios, por lo que habra que definir una relación uno_a_muchos entre comentarios y sitio, y entre comentarios y usuario.

    +

    La vista de la lista de sitios ("index") deberán modificarse para que si existen comentarios a un sitio, aparezca al final de la descripción la palabra comentarios, resaltada en negrita con un hiperenlace a la lista de comentarios.

    +

    La vista de un sitio ("show") deberán modificarse para que si existen comentarios a un sitio, estos se adjunten al final de la descripción del sitio.

    +

    La lista de comentarios incluirá el nombre del autor al principio, seguido de “: ” y del comentario. Las acciones deberán estar filtradas para que reflejen correctamente los permisos, es decir, solo los autores de un comentario podrán editarlo o borrarlo.

    +

    Justo detras de los comentarios aparecerá el texto "Añada su comentario" con un campo de entrada de comentario y un boton de “nuevo comentario”.

    +

    Nota. http://guides.rubyonrails.org/getting_started.html añade comentarios a posts de un blog (similar). + +

    Práctica 3:

    +

    Añadir a la tabla de sitios la captura automatica de sus coordenadas, de forma que al crear un sitio y utilizando el API de geoposicionamiento de HTML5 se añadan las coordenadas obtenidas al sitio.

    +
      +
    • Las coordenadas obtenidas deberan poder ser editadas por el usuario en el formulario
    • +
    • Habra que enriquecer también la tabla de sitios con 3 nuevos campos: longitud, latitud y zoom, doinde guardar dichos valores.
    • +
    +

    Añadir ademas:

    +
      +
    1. A cada sitio de planet un mapa (de Google Maps), que muestre su posicion en el mapa.
    2. +
    3. A cada viaje de planet un mapa (de Google Maps), que muestre la foto de todas las visitas del viaje geoposicionados en sus coordenadas en el mapa
    4. +
    +

    Indicar ademas para cada sitio (lista de sites), el número de veces que ha sido incluido en algún viaje, tanto en la vista individual, como en la lista de sitios.

    + +

    Práctica 4

    +

    Añadir a planet un buscador de sitios y viajes que este en todas las páginas en el mismo lugar (en application.html.erb)

    +

    El buscador tendra un cajetín para introducir un string de 3 o mas caracteres. Tendrá además un botón para lanzar la busqueda de sitios y viajes que contengan el string en el nombre o en la descripción.

    +

    La lista de sitios y viajes se presentará en 2 apartados, el primero contendrá los sitios y el segundo los viajes encontrados.

    +

    Se recomienda asociar la acción de busqueda al controlador planet, debido a que integra vistas parciales de sites y trips.

    +

    Además hay que arreglar todos los tests generados por rails para que pasen correctamente al ejecutar “rake test”. Y añadir un test de funcionalidad para la nueva acción buscar.

    +

    Por último se deberá documentar las páginas de esta entrega en formato RDoc y ejecutar “rake doc:app” para generar doc del proyecto.

    +

    La documentación generada se deberá enlazar con una nueva entrada de la barra de navegación.

    +

    También se deberá desplegar el proyecto en Heroku.

    + + +
    diff --git a/doc/app/js/search_index.js b/doc/app/js/search_index.js index f5703f3..bba34b7 100644 --- a/doc/app/js/search_index.js +++ b/doc/app/js/search_index.js @@ -1 +1 @@ -var search_data = {"index":{"searchIndex":["applicationcontroller","applicationhelper","planetcontroller","planethelper","site","sitescontroller","siteshelper","trip","tripscontroller","tripshelper","type","typescontroller","typeshelper","user","visit","visitscontroller","visitshelper","contact()","create()","create()","create()","create()","destroy()","destroy()","destroy()","destroy()","edit()","edit()","edit()","edit()","ejemplo()","index()","index()","index()","index()","index()","new()","new()","new()","new()","show()","show()","show()","show()","update()","update()","update()","update()","readme_for_app"],"longSearchIndex":["applicationcontroller","applicationhelper","planetcontroller","planethelper","site","sitescontroller","siteshelper","trip","tripscontroller","tripshelper","type","typescontroller","typeshelper","user","visit","visitscontroller","visitshelper","planetcontroller#contact()","sitescontroller#create()","tripscontroller#create()","typescontroller#create()","visitscontroller#create()","sitescontroller#destroy()","tripscontroller#destroy()","typescontroller#destroy()","visitscontroller#destroy()","sitescontroller#edit()","tripscontroller#edit()","typescontroller#edit()","visitscontroller#edit()","planetcontroller#ejemplo()","planetcontroller#index()","sitescontroller#index()","tripscontroller#index()","typescontroller#index()","visitscontroller#index()","sitescontroller#new()","tripscontroller#new()","typescontroller#new()","visitscontroller#new()","sitescontroller#show()","tripscontroller#show()","typescontroller#show()","visitscontroller#show()","sitescontroller#update()","tripscontroller#update()","typescontroller#update()","visitscontroller#update()",""],"info":[["ApplicationController","","ApplicationController.html","",""],["ApplicationHelper","","ApplicationHelper.html","",""],["PlanetController","","PlanetController.html","","

    PlanetController ilustra el uso de RDoc. La documentación\nde un proyecto en genera en el directorio …\n"],["PlanetHelper","","PlanetHelper.html","",""],["Site","","Site.html","",""],["SitesController","","SitesController.html","",""],["SitesHelper","","SitesHelper.html","",""],["Trip","","Trip.html","",""],["TripsController","","TripsController.html","",""],["TripsHelper","","TripsHelper.html","",""],["Type","","Type.html","",""],["TypesController","","TypesController.html","",""],["TypesHelper","","TypesHelper.html","",""],["User","","User.html","",""],["Visit","","Visit.html","",""],["VisitsController","","VisitsController.html","",""],["VisitsHelper","","VisitsHelper.html","",""],["contact","PlanetController","PlanetController.html#method-i-contact","()","

    Método que define una acción vacía del controlador\n"],["create","SitesController","SitesController.html#method-i-create","()","

    POST /sites POST /sites.json\n"],["create","TripsController","TripsController.html#method-i-create","()","

    POST /trips POST /trips.json\n"],["create","TypesController","TypesController.html#method-i-create","()","

    POST /types POST /types.json\n"],["create","VisitsController","VisitsController.html#method-i-create","()","

    POST /visits POST /visits.json\n"],["destroy","SitesController","SitesController.html#method-i-destroy","()","

    DELETE /sites/1 DELETE /sites/1.json\n"],["destroy","TripsController","TripsController.html#method-i-destroy","()","

    DELETE /trips/1 DELETE /trips/1.json\n"],["destroy","TypesController","TypesController.html#method-i-destroy","()","

    DELETE /types/1 DELETE /types/1.json\n"],["destroy","VisitsController","VisitsController.html#method-i-destroy","()","

    DELETE /visits/1 DELETE /visits/1.json\n"],["edit","SitesController","SitesController.html#method-i-edit","()","

    GET /sites/1/edit\n"],["edit","TripsController","TripsController.html#method-i-edit","()","

    GET /trips/1/edit\n"],["edit","TypesController","TypesController.html#method-i-edit","()","

    GET /types/1/edit\n"],["edit","VisitsController","VisitsController.html#method-i-edit","()","

    GET /visits/1/edit\n"],["ejemplo","PlanetController","PlanetController.html#method-i-ejemplo","()","

    Método que define una acción vacía del controlador\n"],["index","PlanetController","PlanetController.html#method-i-index","()","

    Método que define una acción vacía del controlador\n"],["index","SitesController","SitesController.html#method-i-index","()","

    GET /sites GET /sites.json\n"],["index","TripsController","TripsController.html#method-i-index","()","

    GET /trips GET /trips.json\n"],["index","TypesController","TypesController.html#method-i-index","()","

    GET /types GET /types.json\n"],["index","VisitsController","VisitsController.html#method-i-index","()","

    GET /visits GET /visits.json\n"],["new","SitesController","SitesController.html#method-i-new","()","

    GET /sites/new GET /sites/new.json\n"],["new","TripsController","TripsController.html#method-i-new","()","

    GET /trips/new GET /trips/new.json\n"],["new","TypesController","TypesController.html#method-i-new","()","

    GET /types/new GET /types/new.json\n"],["new","VisitsController","VisitsController.html#method-i-new","()","

    GET /visits/new GET /visits/new.json\n"],["show","SitesController","SitesController.html#method-i-show","()","

    GET /sites/1 GET /sites/1.json\n"],["show","TripsController","TripsController.html#method-i-show","()","

    GET /trips/1 GET /trips/1.json\n"],["show","TypesController","TypesController.html#method-i-show","()","

    GET /types/1 GET /types/1.json\n"],["show","VisitsController","VisitsController.html#method-i-show","()","

    GET /visits/1 GET /visits/1.json\n"],["update","SitesController","SitesController.html#method-i-update","()","

    PUT /sites/1 PUT /sites/1.json\n"],["update","TripsController","TripsController.html#method-i-update","()","

    PUT /trips/1 PUT /trips/1.json\n"],["update","TypesController","TypesController.html#method-i-update","()","

    PUT /types/1 PUT /types/1.json\n"],["update","VisitsController","VisitsController.html#method-i-update","()","

    PUT /visits/1 PUT /visits/1.json\n"],["README_FOR_APP","","doc/README_FOR_APP.html","","

    Use this README file to introduce your application and point to useful\nplaces in the API for learning …\n"]]}} \ No newline at end of file +var search_data = {"index":{"searchIndex":["applicationcontroller","applicationhelper","comment","commentscontroller","commentshelper","planetcontroller","planethelper","site","sitescontroller","siteshelper","trip","tripscontroller","tripshelper","type","typescontroller","typeshelper","user","visit","visitscontroller","visitshelper","author()","contact()","create()","create()","create()","create()","create()","destroy()","destroy()","destroy()","destroy()","destroy()","edit()","edit()","edit()","edit()","edit()","ejemplo()","index()","index()","index()","index()","index()","index()","new()","new()","new()","new()","new()","ordered_index()","search()","show()","show()","show()","show()","show()","update()","update()","update()","update()","update()","readme_for_app"],"longSearchIndex":["applicationcontroller","applicationhelper","comment","commentscontroller","commentshelper","planetcontroller","planethelper","site","sitescontroller","siteshelper","trip","tripscontroller","tripshelper","type","typescontroller","typeshelper","user","visit","visitscontroller","visitshelper","planetcontroller#author()","planetcontroller#contact()","commentscontroller#create()","sitescontroller#create()","tripscontroller#create()","typescontroller#create()","visitscontroller#create()","commentscontroller#destroy()","sitescontroller#destroy()","tripscontroller#destroy()","typescontroller#destroy()","visitscontroller#destroy()","commentscontroller#edit()","sitescontroller#edit()","tripscontroller#edit()","typescontroller#edit()","visitscontroller#edit()","planetcontroller#ejemplo()","commentscontroller#index()","planetcontroller#index()","sitescontroller#index()","tripscontroller#index()","typescontroller#index()","visitscontroller#index()","commentscontroller#new()","sitescontroller#new()","tripscontroller#new()","typescontroller#new()","visitscontroller#new()","typescontroller#ordered_index()","planetcontroller#search()","commentscontroller#show()","sitescontroller#show()","tripscontroller#show()","typescontroller#show()","visitscontroller#show()","commentscontroller#update()","sitescontroller#update()","tripscontroller#update()","typescontroller#update()","visitscontroller#update()",""],"info":[["ApplicationController","","ApplicationController.html","","

    Controlador de la aplicación\n

    Incluye la lógica de la aplicación\n

    Clase vacía\n"],["ApplicationHelper","","ApplicationHelper.html","","

    Helper de Application\n

    Se encarga de apoyar a la clase Application\n"],["Comment","","Comment.html","",""],["CommentsController","","CommentsController.html","","

    Controlador de Comments\n

    Incluye la lógica de la clase Comments\n"],["CommentsHelper","","CommentsHelper.html","","

    Helper de Comments\n

    Se encarga de apoyar a la clase Comments\n"],["PlanetController","","PlanetController.html","","

    Controlador de Planet\n

    Incluye la lógica de la clase Planet\n"],["PlanetHelper","","PlanetHelper.html","","

    Helper de Planet\n

    Se encarga de apoyar a la clase Planet\n"],["Site","","Site.html","",""],["SitesController","","SitesController.html","","

    Controlador de Sites\n

    Incluye la lógica de la clase Sites\n"],["SitesHelper","","SitesHelper.html","","

    Helper de Sites\n

    Se encarga de apoyar a la clase Sites\n"],["Trip","","Trip.html","",""],["TripsController","","TripsController.html","","

    Controlador de Trips\n

    Incluye la lógica de la clase Trips\n"],["TripsHelper","","TripsHelper.html","","

    Helper de Trips\n

    Se encarga de apoyar a la clase Trips\n"],["Type","","Type.html","",""],["TypesController","","TypesController.html","","

    Controlador de Types\n

    Incluye la lógica de la clase Types\n"],["TypesHelper","","TypesHelper.html","","

    Helper de Types\n

    Se encarga de apoyar a la clase Types\n"],["User","","User.html","",""],["Visit","","Visit.html","",""],["VisitsController","","VisitsController.html","","

    Controlador de Visits\n

    Incluye la lógica de la clase Visits\n"],["VisitsHelper","","VisitsHelper.html","","

    Helper de Visits\n

    Se encarga de apoyar a la clase Visits\n"],["author","PlanetController","PlanetController.html#method-i-author","()",""],["contact","PlanetController","PlanetController.html#method-i-contact","()","

    Método para contactar\n"],["create","CommentsController","CommentsController.html#method-i-create","()","

    POST /coments POST /coments.json\n"],["create","SitesController","SitesController.html#method-i-create","()","

    POST /sites POST /sites.json\n"],["create","TripsController","TripsController.html#method-i-create","()","

    POST /trips POST /trips.json\n"],["create","TypesController","TypesController.html#method-i-create","()","

    POST /types POST /types.json\n"],["create","VisitsController","VisitsController.html#method-i-create","()","

    POST /visits POST /visits.json\n"],["destroy","CommentsController","CommentsController.html#method-i-destroy","()","

    DELETE /coments/1 DELETE /coments/1.json\n"],["destroy","SitesController","SitesController.html#method-i-destroy","()","

    DELETE /sites/1 DELETE /sites/1.json\n"],["destroy","TripsController","TripsController.html#method-i-destroy","()","

    DELETE /trips/1 DELETE /trips/1.json\n"],["destroy","TypesController","TypesController.html#method-i-destroy","()","

    DELETE /types/1 DELETE /types/1.json\n"],["destroy","VisitsController","VisitsController.html#method-i-destroy","()","

    DELETE /visits/1 DELETE /visits/1.json\n"],["edit","CommentsController","CommentsController.html#method-i-edit","()","

    GET /coments/1/edit\n"],["edit","SitesController","SitesController.html#method-i-edit","()","

    GET /sites/1/edit\n"],["edit","TripsController","TripsController.html#method-i-edit","()","

    GET /trips/1/edit\n"],["edit","TypesController","TypesController.html#method-i-edit","()","

    GET /types/1/edit\n"],["edit","VisitsController","VisitsController.html#method-i-edit","()","

    GET /visits/1/edit\n"],["ejemplo","PlanetController","PlanetController.html#method-i-ejemplo","()","

    Método ejemplo\n"],["index","CommentsController","CommentsController.html#method-i-index","()","

    GET /coments GET /coments.json\n"],["index","PlanetController","PlanetController.html#method-i-index","()","

    Método para mostrar la página inicial\n"],["index","SitesController","SitesController.html#method-i-index","()","

    GET /sites GET /sites.json\n"],["index","TripsController","TripsController.html#method-i-index","()","

    GET /trips GET /trips.json\n"],["index","TypesController","TypesController.html#method-i-index","()","

    GET /types GET /types.json\n"],["index","VisitsController","VisitsController.html#method-i-index","()","

    GET /visits GET /visits.json\n"],["new","CommentsController","CommentsController.html#method-i-new","()","

    Nos permite crear un nuevo comentario GET /coments/new GET\n/coments/new.json\n"],["new","SitesController","SitesController.html#method-i-new","()","

    GET /sites/new GET /sites/new.json\n"],["new","TripsController","TripsController.html#method-i-new","()","

    GET /trips/new GET /trips/new.json\n"],["new","TypesController","TypesController.html#method-i-new","()","

    GET /types/new GET /types/new.json\n"],["new","VisitsController","VisitsController.html#method-i-new","()","

    GET /visits/new GET /visits/new.json\n"],["ordered_index","TypesController","TypesController.html#method-i-ordered_index","()","

    GET /types/ordered_index GET /types/ordered_index.json\n"],["search","PlanetController","PlanetController.html#method-i-search","()",""],["show","CommentsController","CommentsController.html#method-i-show","()","

    GET /comentarios/1 GET /comentarios/1.json\n"],["show","SitesController","SitesController.html#method-i-show","()","

    GET /sites/1 GET /sites/1.json\n"],["show","TripsController","TripsController.html#method-i-show","()","

    GET /trips/1 GET /trips/1.json\n"],["show","TypesController","TypesController.html#method-i-show","()","

    GET /types/1 GET /types/1.json\n"],["show","VisitsController","VisitsController.html#method-i-show","()","

    GET /visits/1 GET /visits/1.json\n"],["update","CommentsController","CommentsController.html#method-i-update","()","

    PUT /comments/1 PUT /comments/1.json\n"],["update","SitesController","SitesController.html#method-i-update","()","

    PUT /sites/1 PUT /sites/1.json\n"],["update","TripsController","TripsController.html#method-i-update","()","

    PUT /trips/1 PUT /trips/1.json\n"],["update","TypesController","TypesController.html#method-i-update","()","

    PUT /types/1 PUT /types/1.json\n"],["update","VisitsController","VisitsController.html#method-i-update","()","

    PUT /visits/1 PUT /visits/1.json\n"],["README_FOR_APP","","doc/README_FOR_APP.html","","

    Use this README file to introduce your application and point to useful\nplaces in the API for learning …\n"]]}} \ No newline at end of file diff --git a/doc/app/table_of_contents.html b/doc/app/table_of_contents.html index cf87ce4..534d77c 100644 --- a/doc/app/table_of_contents.html +++ b/doc/app/table_of_contents.html @@ -35,47 +35,111 @@

    Classes/Modules

    @@ -95,26 +169,34 @@

    Classes/Modules

    Methods

      +
    • #author — PlanetController +
    • #contact — PlanetController
    • #create — TypesController +
    • #create — VisitsController + +
    • #create — CommentsController +
    • #create — SitesController
    • #create — TripsController -
    • #create — VisitsController +
    • #destroy — SitesController
    • #destroy — TripsController -
    • #destroy — TypesController +
    • #destroy — CommentsController
    • #destroy — VisitsController -
    • #destroy — SitesController +
    • #destroy — TypesController
    • #edit — TripsController +
    • #edit — CommentsController +
    • #edit — TypesController
    • #edit — VisitsController @@ -123,36 +205,48 @@

      Methods

    • #ejemplo — PlanetController -
    • #index — VisitsController - -
    • #index — SitesController +
    • #index — TypesController
    • #index — TripsController -
    • #index — TypesController +
    • #index — VisitsController
    • #index — PlanetController -
    • #new — TypesController +
    • #index — SitesController + +
    • #index — CommentsController
    • #new — SitesController
    • #new — TripsController +
    • #new — CommentsController + +
    • #new — TypesController +
    • #new — VisitsController +
    • #ordered_index — TypesController + +
    • #search — PlanetController +
    • #show — TripsController +
    • #show — SitesController +
    • #show — TypesController -
    • #show — SitesController +
    • #show — CommentsController
    • #show — VisitsController -
    • #update — SitesController -
    • #update — TypesController +
    • #update — CommentsController + +
    • #update — SitesController +
    • #update — VisitsController
    • #update — TripsController From 90d021099d593db58ce61925238a8919449bbfe9 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Fri, 27 Apr 2012 08:42:49 +0200 Subject: [PATCH 16/17] Entrega final --- app/assets/stylesheets/planet.css | 6 + app/controllers/planet_controller.rb | 4 + app/views/layouts/application.html.erb | 19 +- app/views/layouts/special_layout.html.erb | 1 + app/views/planet/doc.html | 1 + config/routes.rb | 4 + doc.html | 1 + public/app/ApplicationController.html | 169 +++++++ public/app/ApplicationHelper.html | 161 +++++++ public/app/Comment.html | 163 +++++++ public/app/CommentsController.html | 457 ++++++++++++++++++ public/app/CommentsHelper.html | 161 +++++++ public/app/PlanetController.html | 343 ++++++++++++++ public/app/PlanetHelper.html | 161 +++++++ public/app/Site.html | 163 +++++++ public/app/SitesController.html | 450 ++++++++++++++++++ public/app/SitesHelper.html | 161 +++++++ public/app/Trip.html | 163 +++++++ public/app/TripsController.html | 447 ++++++++++++++++++ public/app/TripsHelper.html | 161 +++++++ public/app/Type.html | 163 +++++++ public/app/TypesController.html | 483 +++++++++++++++++++ public/app/TypesHelper.html | 161 +++++++ public/app/User.html | 163 +++++++ public/app/Visit.html | 163 +++++++ public/app/VisitsController.html | 447 ++++++++++++++++++ public/app/VisitsHelper.html | 161 +++++++ public/app/created.rid | 22 + public/app/doc/README_FOR_APP.html | 123 +++++ public/app/images/add.png | Bin 0 -> 733 bytes public/app/images/brick.png | Bin 0 -> 452 bytes public/app/images/brick_link.png | Bin 0 -> 764 bytes public/app/images/bug.png | Bin 0 -> 774 bytes public/app/images/bullet_black.png | Bin 0 -> 211 bytes public/app/images/bullet_toggle_minus.png | Bin 0 -> 207 bytes public/app/images/bullet_toggle_plus.png | Bin 0 -> 209 bytes public/app/images/date.png | Bin 0 -> 626 bytes public/app/images/delete.png | Bin 0 -> 715 bytes public/app/images/find.png | Bin 0 -> 659 bytes public/app/images/loadingAnimation.gif | Bin 0 -> 5886 bytes public/app/images/macFFBgHack.png | Bin 0 -> 207 bytes public/app/images/package.png | Bin 0 -> 853 bytes public/app/images/page_green.png | Bin 0 -> 621 bytes public/app/images/page_white_text.png | Bin 0 -> 342 bytes public/app/images/page_white_width.png | Bin 0 -> 309 bytes public/app/images/plugin.png | Bin 0 -> 591 bytes public/app/images/ruby.png | Bin 0 -> 592 bytes public/app/images/tag_blue.png | Bin 0 -> 1880 bytes public/app/images/tag_green.png | Bin 0 -> 613 bytes public/app/images/transparent.png | Bin 0 -> 97 bytes public/app/images/wrench.png | Bin 0 -> 610 bytes public/app/images/wrench_orange.png | Bin 0 -> 584 bytes public/app/images/zoom.png | Bin 0 -> 692 bytes public/app/index.html | 208 +++++++++ public/app/js/darkfish.js | 153 ++++++ public/app/js/jquery.js | 18 + public/app/js/navigation.js | 142 ++++++ public/app/js/search.js | 94 ++++ public/app/js/search_index.js | 1 + public/app/js/searcher.js | 228 +++++++++ public/app/rdoc.css | 543 ++++++++++++++++++++++ public/app/table_of_contents.html | 262 +++++++++++ public/doc.html | 1 + 63 files changed, 6726 insertions(+), 6 deletions(-) create mode 100644 app/views/layouts/special_layout.html.erb create mode 120000 app/views/planet/doc.html create mode 120000 doc.html create mode 100644 public/app/ApplicationController.html create mode 100644 public/app/ApplicationHelper.html create mode 100644 public/app/Comment.html create mode 100644 public/app/CommentsController.html create mode 100644 public/app/CommentsHelper.html create mode 100644 public/app/PlanetController.html create mode 100644 public/app/PlanetHelper.html create mode 100644 public/app/Site.html create mode 100644 public/app/SitesController.html create mode 100644 public/app/SitesHelper.html create mode 100644 public/app/Trip.html create mode 100644 public/app/TripsController.html create mode 100644 public/app/TripsHelper.html create mode 100644 public/app/Type.html create mode 100644 public/app/TypesController.html create mode 100644 public/app/TypesHelper.html create mode 100644 public/app/User.html create mode 100644 public/app/Visit.html create mode 100644 public/app/VisitsController.html create mode 100644 public/app/VisitsHelper.html create mode 100644 public/app/created.rid create mode 100644 public/app/doc/README_FOR_APP.html create mode 100755 public/app/images/add.png create mode 100644 public/app/images/brick.png create mode 100644 public/app/images/brick_link.png create mode 100644 public/app/images/bug.png create mode 100644 public/app/images/bullet_black.png create mode 100644 public/app/images/bullet_toggle_minus.png create mode 100644 public/app/images/bullet_toggle_plus.png create mode 100644 public/app/images/date.png create mode 100755 public/app/images/delete.png create mode 100644 public/app/images/find.png create mode 100644 public/app/images/loadingAnimation.gif create mode 100644 public/app/images/macFFBgHack.png create mode 100644 public/app/images/package.png create mode 100644 public/app/images/page_green.png create mode 100644 public/app/images/page_white_text.png create mode 100644 public/app/images/page_white_width.png create mode 100644 public/app/images/plugin.png create mode 100644 public/app/images/ruby.png create mode 100755 public/app/images/tag_blue.png create mode 100644 public/app/images/tag_green.png create mode 100644 public/app/images/transparent.png create mode 100644 public/app/images/wrench.png create mode 100644 public/app/images/wrench_orange.png create mode 100644 public/app/images/zoom.png create mode 100644 public/app/index.html create mode 100644 public/app/js/darkfish.js create mode 100644 public/app/js/jquery.js create mode 100644 public/app/js/navigation.js create mode 100644 public/app/js/search.js create mode 100644 public/app/js/search_index.js create mode 100644 public/app/js/searcher.js create mode 100644 public/app/rdoc.css create mode 100644 public/app/table_of_contents.html create mode 120000 public/doc.html diff --git a/app/assets/stylesheets/planet.css b/app/assets/stylesheets/planet.css index 31b0ab8..fb9eedf 100644 --- a/app/assets/stylesheets/planet.css +++ b/app/assets/stylesheets/planet.css @@ -174,4 +174,10 @@ #shortcuts a:visited{ color: #306e2c; font-size: 1.3em; +} +.user a:visited{ + color: white; +} +.user a{ + color: white; } \ No newline at end of file diff --git a/app/controllers/planet_controller.rb b/app/controllers/planet_controller.rb index 88f13c6..625b352 100644 --- a/app/controllers/planet_controller.rb +++ b/app/controllers/planet_controller.rb @@ -15,6 +15,10 @@ def ejemplo def author end + def doc + #render 'doc.html', :layout =>false + redirect_to "/doc/app/index.html" + end def search if params[:q].length >= 3 @search= params[:q] diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 3879519..adeb3df 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -38,12 +38,15 @@
      - <%= link_to "Home", planet_index_path %>
      - <%= link_to "Tipos", types_path %>
      - <%= link_to "Sitios", sites_path %>
      - <%= link_to "Viajes", trips_path %>
      - <%= link_to "Contact", planet_contact_path %>
      - <%= link_to "Sign up", new_user_registration_path unless current_user %> + <%= link_to "Home", planet_index_path %>
      + <%= link_to "Tipos", types_path %>
      + <%= link_to "Sitios", sites_path %>
      + <%= link_to "Viajes", trips_path %>
      + <%= link_to "Autores", planet_author_path %>
      + <%= link_to "Tipos ordenados", types_ordered_index_path %> + <%= link_to "Contact", planet_contact_path %>
      + <%= link_to "Documentación", "/app/index.html" %> + <%= link_to "Sign up", new_user_registration_path if !current_user %>
      @@ -55,6 +58,7 @@ <%= link_to "Autores", planet_author_path %> <%= link_to "Tipos ordenados", types_ordered_index_path %> <%= link_to "Contact", planet_contact_path %> + <%= link_to "Documentación", "/app/index.html" %> <%= link_to "Sign up", new_user_registration_path if !current_user %>

      <%= notice %>

      <%= alert %>

      @@ -64,9 +68,12 @@ <%= link_to "Home", planet_index_path %> <%= link_to "Tipos", types_path %> <%= link_to "Sitios", sites_path %> + <%= link_to "Viajes", trips_path %> <%= link_to "Autores", planet_author_path %> <%= link_to "Tipos ordenados", types_ordered_index_path %> <%= link_to "Contact", planet_contact_path %> + <%= link_to "Documentación", "/app/index.html" %> + <%= link_to "Sign up", new_user_registration_path if !current_user %>
    diff --git a/app/views/layouts/special_layout.html.erb b/app/views/layouts/special_layout.html.erb new file mode 100644 index 0000000..fe6ac47 --- /dev/null +++ b/app/views/layouts/special_layout.html.erb @@ -0,0 +1 @@ +special_layout.html.erb \ No newline at end of file diff --git a/app/views/planet/doc.html b/app/views/planet/doc.html new file mode 120000 index 0000000..930501a --- /dev/null +++ b/app/views/planet/doc.html @@ -0,0 +1 @@ +/Users/carloscrespog/Documents/SWCM/planet2012/doc/app/index.html \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index d7aa813..a3e0389 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -29,6 +29,10 @@ get "planet/author" + get "planet/doc" + #match "planet/doc" => redirect("/app/views/planet/doc") + + get "planet/search" post "planet/search" diff --git a/doc.html b/doc.html new file mode 120000 index 0000000..930501a --- /dev/null +++ b/doc.html @@ -0,0 +1 @@ +/Users/carloscrespog/Documents/SWCM/planet2012/doc/app/index.html \ No newline at end of file diff --git a/public/app/ApplicationController.html b/public/app/ApplicationController.html new file mode 100644 index 0000000..ca1ace0 --- /dev/null +++ b/public/app/ApplicationController.html @@ -0,0 +1,169 @@ + + + + + + +class ApplicationController - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    class ApplicationController

    + +
    + +

    Controlador de la aplicación

    + +

    Incluye la lógica de la aplicación

    + +

    Clase vacía

    + +
    + + + + +
    + + + + + + + + + + +
    + +
    + + + + diff --git a/public/app/ApplicationHelper.html b/public/app/ApplicationHelper.html new file mode 100644 index 0000000..33016c7 --- /dev/null +++ b/public/app/ApplicationHelper.html @@ -0,0 +1,161 @@ + + + + + + +module ApplicationHelper - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    module ApplicationHelper

    + +
    + +

    Helper de Application

    + +

    Se encarga de apoyar a la clase Application

    + +
    + + + + +
    + + + + + + + + + + +
    + +
    + + + + diff --git a/public/app/Comment.html b/public/app/Comment.html new file mode 100644 index 0000000..f2d1e40 --- /dev/null +++ b/public/app/Comment.html @@ -0,0 +1,163 @@ + + + + + + +class Comment - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    class Comment

    + +
    + +
    + + + + +
    + + + + + + + + + + +
    + +
    + + + + diff --git a/public/app/CommentsController.html b/public/app/CommentsController.html new file mode 100644 index 0000000..cc7a430 --- /dev/null +++ b/public/app/CommentsController.html @@ -0,0 +1,457 @@ + + + + + + +class CommentsController - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    class CommentsController

    + +
    + +

    Controlador de Comments

    + +

    Incluye la lógica de la clase Comments

    + +
    + + + + +
    + + + + + + + + + + +
    +

    Public Instance Methods

    + + +
    + +
    + create() + click to toggle source +
    + + +
    + +

    POST /coments POST /coments.json

    + + + +
    +
    # File app/controllers/comments_controller.rb, line 25
    +def create
    +              @site = Site.find(params[:site_id])
    +              @comment = @site.comments.create(params[:comment])
    +              @comment.user_id = current_user.id
    +              
    +              respond_to do |format|
    +              if @comment.save
    +              format.html { redirect_to @site, notice: 'Comentario creado' }
    +              format.json { head :no_content }
    +      else
    +              format.html { render action: "edit" }
    +              format.json { render json: @comment.errors, status: :unprocessable_entity }
    +      end
    +      end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + destroy() + click to toggle source +
    + + +
    + +

    DELETE /coments/1 DELETE /coments/1.json

    + + + +
    +
    # File app/controllers/comments_controller.rb, line 59
    +def destroy
    +  @site = Site.find(params[:site_id])
    +  @comment = @site.comments.find(params[:id])
    +  @comment.destroy
    +  respond_to do |format|
    +    format.html { redirect_to site_path(@site) }
    +    format.json { head :no_content }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + edit() + click to toggle source +
    + + +
    + +

    GET /coments/1/edit

    + + + +
    +
    # File app/controllers/comments_controller.rb, line 86
    +def edit
    +      @site = Site.find(params[:site_id])
    +      @comment = @site.comments.find(params[:id])
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + index() + click to toggle source +
    + + +
    + +

    GET /coments GET /coments.json

    + + + +
    +
    # File app/controllers/comments_controller.rb, line 12
    +def index
    +      if params[:site_id].nil? or params[:site_id].empty?
    +    @comments = Comment.all            # path: /sites
    +    else
    +    @comments = Site.find(params[:site_id]).comments  # path: /sites/id/comentarios
    +  end
    +  respond_to do |format|
    +    format.html # index.html.erb
    +    format.json { render json: @comments }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + new() + click to toggle source +
    + + +
    + +

    Nos permite crear un nuevo comentario GET /coments/new GET +/coments/new.json

    + + + +
    +
    # File app/controllers/comments_controller.rb, line 44
    +def new
    +  @comment = Comment.new
    +  
    +  if !params[:site_id].nil? 
    +@site = Site.find(params[:site_id])       
    +  end
    +  respond_to do |format|
    +    format.html # new.html.erb
    +    format.json { render json: @comment }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + show() + click to toggle source +
    + + +
    + +

    GET /comentarios/1 GET /comentarios/1.json

    + + + +
    +
    # File app/controllers/comments_controller.rb, line 93
    +def show
    +  @comentario = Comment.find(params[:id])
    +
    +  respond_to do |format|
    +    format.html # show.html.erb
    +    format.json { render json: @comment }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + update() + click to toggle source +
    + + +
    + +

    PUT /comments/1 PUT /comments/1.json

    + + + +
    +
    # File app/controllers/comments_controller.rb, line 71
    +def update
    +       @site = Site.find(params[:site_id])
    +       @comment = @site.comments.find(params[:id])
    +
    +       respond_to do |format|
    +                if @comment.update_attributes(params[:comment])
    +                    format.html { redirect_to @site, notice: 'Comentario actualizado' }
    +                    format.json { head :no_content }
    +                else
    +                       format.html { render action: "edit" }
    +                    format.json { render json: @comment.errors, status: :unprocessable_entity }
    +                end
    +        end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + +
    + + + + diff --git a/public/app/CommentsHelper.html b/public/app/CommentsHelper.html new file mode 100644 index 0000000..b0b97c2 --- /dev/null +++ b/public/app/CommentsHelper.html @@ -0,0 +1,161 @@ + + + + + + +module CommentsHelper - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    module CommentsHelper

    + +
    + +

    Helper de Comments

    + +

    Se encarga de apoyar a la clase Comments

    + +
    + + + + +
    + + + + + + + + + + +
    + +
    + + + + diff --git a/public/app/PlanetController.html b/public/app/PlanetController.html new file mode 100644 index 0000000..6dcb869 --- /dev/null +++ b/public/app/PlanetController.html @@ -0,0 +1,343 @@ + + + + + + +class PlanetController - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    class PlanetController

    + +
    + +

    Controlador de Planet

    + +

    Incluye la lógica de la clase Planet

    + +
    + + + + +
    + + + + + + + + + + +
    +

    Public Instance Methods

    + + +
    + +
    + author() + click to toggle source +
    + + +
    + + + + + +
    +
    # File app/controllers/planet_controller.rb, line 15
    +def author
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + contact() + click to toggle source +
    + + +
    + +

    Método para contactar

    + + + +
    +
    # File app/controllers/planet_controller.rb, line 9
    +def contact
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + ejemplo() + click to toggle source +
    + + +
    + +

    Método ejemplo

    + + + +
    +
    # File app/controllers/planet_controller.rb, line 12
    +def ejemplo
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + index() + click to toggle source +
    + + +
    + +

    Método para mostrar la página inicial

    + + + +
    +
    # File app/controllers/planet_controller.rb, line 6
    +def index
    +end
    +
    + +
    + + + + +
    + + + + + +
    + +
    + +
    + + + + diff --git a/public/app/PlanetHelper.html b/public/app/PlanetHelper.html new file mode 100644 index 0000000..c8f7ab2 --- /dev/null +++ b/public/app/PlanetHelper.html @@ -0,0 +1,161 @@ + + + + + + +module PlanetHelper - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    module PlanetHelper

    + +
    + +

    Helper de Planet

    + +

    Se encarga de apoyar a la clase Planet

    + +
    + + + + +
    + + + + + + + + + + +
    + +
    + + + + diff --git a/public/app/Site.html b/public/app/Site.html new file mode 100644 index 0000000..263a976 --- /dev/null +++ b/public/app/Site.html @@ -0,0 +1,163 @@ + + + + + + +class Site - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    class Site

    + +
    + +
    + + + + +
    + + + + + + + + + + +
    + +
    + + + + diff --git a/public/app/SitesController.html b/public/app/SitesController.html new file mode 100644 index 0000000..448c79b --- /dev/null +++ b/public/app/SitesController.html @@ -0,0 +1,450 @@ + + + + + + +class SitesController - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    class SitesController

    + +
    + +

    Controlador de Sites

    + +

    Incluye la lógica de la clase Sites

    + +
    + + + + +
    + + + + + + + + + + +
    +

    Public Instance Methods

    + + +
    + +
    + create() + click to toggle source +
    + + +
    + +

    POST /sites POST /sites.json

    + + + +
    +
    # File app/controllers/sites_controller.rb, line 55
    +def create
    +  @site = current_user.sites.build(params[:site]) # Asigna solo si sitio asociado a current_user
    +  
    +  respond_to do |format|
    +    if @site.save
    +      format.html { redirect_to @site, notice: 'Site was successfully created.' }
    +      format.json { render json: @site, status: :created, location: @site }
    +    else
    +      format.html { render action: "new" }
    +      format.json { render json: @site.errors, status: :unprocessable_entity }
    +    end
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + destroy() + click to toggle source +
    + + +
    + +

    DELETE /sites/1 DELETE /sites/1.json

    + + + +
    +
    # File app/controllers/sites_controller.rb, line 87
    +def destroy
    +  @site = current_user.sites.find(params[:id])  # busca solo en sitios asociados a current_user
    +  @site.destroy
    +
    +  respond_to do |format|
    +    format.html { redirect_to sites_url }
    +    format.json { head :no_content }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + edit() + click to toggle source +
    + + +
    + +

    GET /sites/1/edit

    + + + +
    +
    # File app/controllers/sites_controller.rb, line 49
    +def edit
    +  @site = current_user.sites.find(params[:id])  # busca solo en sitios asociados a current_user
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + index() + click to toggle source +
    + + +
    + +

    GET /sites GET /sites.json

    + + + +
    +
    # File app/controllers/sites_controller.rb, line 13
    +def index
    +  if params[:type_id].nil? or params[:type_id].empty?
    +    @sites = Site.all            # path: /types
    +    else
    +    @sites = Type.find(params[:type_id]).sites  # path: /types/id/sites
    +  end
    +  respond_to do |format|
    +    format.html # index.html.erb
    +    format.json { render json: @sites }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + new() + click to toggle source +
    + + +
    + +

    GET /sites/new GET /sites/new.json

    + + + +
    +
    # File app/controllers/sites_controller.rb, line 39
    +def new
    +  @site = current_user.sites.build # crea sitio vacio asociado a current_user
    +  
    +  respond_to do |format|
    +    format.html # new.html.erb
    +    format.json { render json: @site }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + show() + click to toggle source +
    + + +
    + +

    GET /sites/1 GET /sites/1.json

    + + + +
    +
    # File app/controllers/sites_controller.rb, line 27
    +def show
    +  @site = Site.find(params[:id])
    +  
    +
    +  respond_to do |format|
    +    format.html # show.html.erb
    +    format.json { render json: @site }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + update() + click to toggle source +
    + + +
    + +

    PUT /sites/1 PUT /sites/1.json

    + + + +
    +
    # File app/controllers/sites_controller.rb, line 71
    +def update
    +  @site = current_user.sites.find(params[:id])  # busca solo en sitios asociados a current_user 
    +  
    +  respond_to do |format|
    +    if @site.update_attributes(params[:site])
    +      format.html { redirect_to @site, notice: 'Site was successfully updated.' }
    +      format.json { head :no_content }
    +    else
    +      format.html { render action: "edit" }
    +      format.json { render json: @site.errors, status: :unprocessable_entity }
    +    end
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + +
    + + + + diff --git a/public/app/SitesHelper.html b/public/app/SitesHelper.html new file mode 100644 index 0000000..e0820e7 --- /dev/null +++ b/public/app/SitesHelper.html @@ -0,0 +1,161 @@ + + + + + + +module SitesHelper - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    module SitesHelper

    + +
    + +

    Helper de Sites

    + +

    Se encarga de apoyar a la clase Sites

    + +
    + + + + +
    + + + + + + + + + + +
    + +
    + + + + diff --git a/public/app/Trip.html b/public/app/Trip.html new file mode 100644 index 0000000..f83874c --- /dev/null +++ b/public/app/Trip.html @@ -0,0 +1,163 @@ + + + + + + +class Trip - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    class Trip

    + +
    + +
    + + + + +
    + + + + + + + + + + +
    + +
    + + + + diff --git a/public/app/TripsController.html b/public/app/TripsController.html new file mode 100644 index 0000000..5f00999 --- /dev/null +++ b/public/app/TripsController.html @@ -0,0 +1,447 @@ + + + + + + +class TripsController - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    class TripsController

    + +
    + +

    Controlador de Trips

    + +

    Incluye la lógica de la clase Trips

    + +
    + + + + +
    + + + + + + + + + + +
    +

    Public Instance Methods

    + + +
    + +
    + create() + click to toggle source +
    + + +
    + +

    POST /trips POST /trips.json

    + + + +
    +
    # File app/controllers/trips_controller.rb, line 51
    +def create
    +  @trip = current_user.trips.build(params[:trip])
    +
    +  respond_to do |format|
    +    if @trip.save
    +      format.html { redirect_to @trip, notice: 'Trip was successfully created.' }
    +      format.json { render json: @trip, status: :created, location: @trip }
    +    else
    +      format.html { render action: "new" }
    +      format.json { render json: @trip.errors, status: :unprocessable_entity }
    +    end
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + destroy() + click to toggle source +
    + + +
    + +

    DELETE /trips/1 DELETE /trips/1.json

    + + + +
    +
    # File app/controllers/trips_controller.rb, line 83
    +def destroy
    +  @trip = current_user.trips.find(params[:id])
    +  @trip.destroy
    +
    +  respond_to do |format|
    +    format.html { redirect_to trips_url }
    +    format.json { head :no_content }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + edit() + click to toggle source +
    + + +
    + +

    GET /trips/1/edit

    + + + +
    +
    # File app/controllers/trips_controller.rb, line 45
    +def edit
    +  @trip = current_user.trips.find(params[:id])
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + index() + click to toggle source +
    + + +
    + +

    GET /trips GET /trips.json

    + + + +
    +
    # File app/controllers/trips_controller.rb, line 12
    +def index
    +  @trips = Trip.all
    +
    +  respond_to do |format|
    +    format.html # index.html.erb
    +    format.json { render json: @trips }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + new() + click to toggle source +
    + + +
    + +

    GET /trips/new GET /trips/new.json

    + + + +
    +
    # File app/controllers/trips_controller.rb, line 35
    +def new
    +  @trip = current_user.trips.build
    +  
    +  respond_to do |format|
    +    format.html # new.html.erb
    +    format.json { render json: @trip }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + show() + click to toggle source +
    + + +
    + +

    GET /trips/1 GET /trips/1.json

    + + + +
    +
    # File app/controllers/trips_controller.rb, line 23
    +def show
    +  @trip = Trip.find(params[:id])
    +  @visit = @trip.visits.build
    +
    +  respond_to do |format|
    +    format.html # show.html.erb
    +    format.json { render json: @trip }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + update() + click to toggle source +
    + + +
    + +

    PUT /trips/1 PUT /trips/1.json

    + + + +
    +
    # File app/controllers/trips_controller.rb, line 67
    +def update
    +  @trip = current_user.trips.find(params[:id])
    +  
    +  respond_to do |format|
    +    if @trip.update_attributes(params[:trip])
    +      format.html { redirect_to @trip, notice: 'Trip was successfully updated.' }
    +      format.json { head :no_content }
    +    else
    +      format.html { render action: "edit" }
    +      format.json { render json: @trip.errors, status: :unprocessable_entity }
    +    end
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + +
    + + + + diff --git a/public/app/TripsHelper.html b/public/app/TripsHelper.html new file mode 100644 index 0000000..b9593fc --- /dev/null +++ b/public/app/TripsHelper.html @@ -0,0 +1,161 @@ + + + + + + +module TripsHelper - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    module TripsHelper

    + +
    + +

    Helper de Trips

    + +

    Se encarga de apoyar a la clase Trips

    + +
    + + + + +
    + + + + + + + + + + +
    + +
    + + + + diff --git a/public/app/Type.html b/public/app/Type.html new file mode 100644 index 0000000..0dd1429 --- /dev/null +++ b/public/app/Type.html @@ -0,0 +1,163 @@ + + + + + + +class Type - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    class Type

    + +
    + +
    + + + + +
    + + + + + + + + + + +
    + +
    + + + + diff --git a/public/app/TypesController.html b/public/app/TypesController.html new file mode 100644 index 0000000..9a71e5c --- /dev/null +++ b/public/app/TypesController.html @@ -0,0 +1,483 @@ + + + + + + +class TypesController - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    class TypesController

    + +
    + +

    Controlador de Types

    + +

    Incluye la lógica de la clase Types

    + +
    + + + + +
    + + + + + + + + + + +
    +

    Public Instance Methods

    + + +
    + +
    + create() + click to toggle source +
    + + +
    + +

    POST /types POST /types.json

    + + + +
    +
    # File app/controllers/types_controller.rb, line 55
    +def create
    +  @type = Type.new(params[:type])
    +
    +  respond_to do |format|
    +    if @type.save
    +      format.html { redirect_to @type, notice: 'Type was successfully created.' }
    +      format.json { render json: @type, status: :created, location: @type }
    +    else
    +      format.html { render action: "new" }
    +      format.json { render json: @type.errors, status: :unprocessable_entity }
    +    end
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + destroy() + click to toggle source +
    + + +
    + +

    DELETE /types/1 DELETE /types/1.json

    + + + +
    +
    # File app/controllers/types_controller.rb, line 87
    +def destroy
    +  @type = Type.find(params[:id])
    +  @type.destroy
    +
    +  respond_to do |format|
    +    format.html { redirect_to types_url }
    +    format.json { head :no_content }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + edit() + click to toggle source +
    + + +
    + +

    GET /types/1/edit

    + + + +
    +
    # File app/controllers/types_controller.rb, line 49
    +def edit
    +  @type = Type.find(params[:id])
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + index() + click to toggle source +
    + + +
    + +

    GET /types GET /types.json

    + + + +
    +
    # File app/controllers/types_controller.rb, line 8
    +def index
    +  @types = Type.all
    +
    +  respond_to do |format|
    +    format.html # index.html.erb
    +    format.json { render json: @types }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + new() + click to toggle source +
    + + +
    + +

    GET /types/new GET /types/new.json

    + + + +
    +
    # File app/controllers/types_controller.rb, line 39
    +def new
    +  @type = Type.new
    +
    +  respond_to do |format|
    +    format.html # new.html.erb
    +    format.json { render json: @type }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + ordered_index() + click to toggle source +
    + + +
    + +

    GET /types/ordered_index GET /types/ordered_index.json

    + + + +
    +
    # File app/controllers/types_controller.rb, line 18
    +def ordered_index
    +  @types = Type.find(:all, :order => :name) 
    +
    +  respond_to do |format|
    +    format.html # index.html.erb
    +    format.json { render json: @types }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + show() + click to toggle source +
    + + +
    + +

    GET /types/1 GET /types/1.json

    + + + +
    +
    # File app/controllers/types_controller.rb, line 28
    +def show
    +  @type = Type.find(params[:id])
    +
    +  respond_to do |format|
    +    format.html # show.html.erb
    +    format.json { render json: @type }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + update() + click to toggle source +
    + + +
    + +

    PUT /types/1 PUT /types/1.json

    + + + +
    +
    # File app/controllers/types_controller.rb, line 71
    +def update
    +  @type = Type.find(params[:id])
    +
    +  respond_to do |format|
    +    if @type.update_attributes(params[:type])
    +      format.html { redirect_to @type, notice: 'Type was successfully updated.' }
    +      format.json { head :no_content }
    +    else
    +      format.html { render action: "edit" }
    +      format.json { render json: @type.errors, status: :unprocessable_entity }
    +    end
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + +
    + + + + diff --git a/public/app/TypesHelper.html b/public/app/TypesHelper.html new file mode 100644 index 0000000..a825f58 --- /dev/null +++ b/public/app/TypesHelper.html @@ -0,0 +1,161 @@ + + + + + + +module TypesHelper - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    module TypesHelper

    + +
    + +

    Helper de Types

    + +

    Se encarga de apoyar a la clase Types

    + +
    + + + + +
    + + + + + + + + + + +
    + +
    + + + + diff --git a/public/app/User.html b/public/app/User.html new file mode 100644 index 0000000..19f3ed7 --- /dev/null +++ b/public/app/User.html @@ -0,0 +1,163 @@ + + + + + + +class User - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    class User

    + +
    + +
    + + + + +
    + + + + + + + + + + +
    + +
    + + + + diff --git a/public/app/Visit.html b/public/app/Visit.html new file mode 100644 index 0000000..67d89ed --- /dev/null +++ b/public/app/Visit.html @@ -0,0 +1,163 @@ + + + + + + +class Visit - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    class Visit

    + +
    + +
    + + + + +
    + + + + + + + + + + +
    + +
    + + + + diff --git a/public/app/VisitsController.html b/public/app/VisitsController.html new file mode 100644 index 0000000..66f5b1d --- /dev/null +++ b/public/app/VisitsController.html @@ -0,0 +1,447 @@ + + + + + + +class VisitsController - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    class VisitsController

    + +
    + +

    Controlador de Visits

    + +

    Incluye la lógica de la clase Visits

    + +
    + + + + +
    + + + + + + + + + + +
    +

    Public Instance Methods

    + + +
    + +
    + create() + click to toggle source +
    + + +
    + +

    POST /visits POST /visits.json

    + + + +
    +
    # File app/controllers/visits_controller.rb, line 46
    +def create
    +  @visit = Visit.new(params[:visit])
    +
    +  respond_to do |format|
    +    if @visit.save
    +      format.html { redirect_to @visit.trip, notice: 'Visit was successfully created.' }
    +      format.js
    +      format.json { render json: @visit, status: :created, location: @visit }
    +    else
    +      format.html { render action: "new" }
    +      format.json { render json: @visit.errors, status: :unprocessable_entity }
    +    end
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + destroy() + click to toggle source +
    + + +
    + +

    DELETE /visits/1 DELETE /visits/1.json

    + + + +
    +
    # File app/controllers/visits_controller.rb, line 79
    +def destroy
    +  @visit = Visit.find(params[:id])
    +  @visit.destroy
    +
    +  respond_to do |format|
    +    format.html { redirect_to @visit.trip }
    +    format.json { head :no_content }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + edit() + click to toggle source +
    + + +
    + +

    GET /visits/1/edit

    + + + +
    +
    # File app/controllers/visits_controller.rb, line 40
    +def edit
    +  @visit = Visit.find(params[:id])
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + index() + click to toggle source +
    + + +
    + +

    GET /visits GET /visits.json

    + + + +
    +
    # File app/controllers/visits_controller.rb, line 8
    +def index
    +  @visits = Visit.all
    +
    +  respond_to do |format|
    +    format.html # index.html.erb
    +    format.json { render json: @visits }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + new() + click to toggle source +
    + + +
    + +

    GET /visits/new GET /visits/new.json

    + + + +
    +
    # File app/controllers/visits_controller.rb, line 30
    +def new
    +  @visit = Visit.new
    +
    +  respond_to do |format|
    +    format.html # new.html.erb
    +    format.json { render json: @visit }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + show() + click to toggle source +
    + + +
    + +

    GET /visits/1 GET /visits/1.json

    + + + +
    +
    # File app/controllers/visits_controller.rb, line 19
    +def show
    +  @visit = Visit.find(params[:id])
    +
    +  respond_to do |format|
    +    format.html # show.html.erb
    +    format.json { render json: @visit }
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + update() + click to toggle source +
    + + +
    + +

    PUT /visits/1 PUT /visits/1.json

    + + + +
    +
    # File app/controllers/visits_controller.rb, line 63
    +def update
    +  @visit = Visit.find(params[:id])
    +
    +  respond_to do |format|
    +    if @visit.update_attributes(params[:visit])
    +      format.html { redirect_to @visit.trip, notice: 'Visit was successfully updated.' }
    +      format.json { head :no_content }
    +    else
    +      format.html { render action: "edit" }
    +      format.json { render json: @visit.errors, status: :unprocessable_entity }
    +    end
    +  end
    +end
    +
    + +
    + + + + +
    + + +
    + +
    + +
    + + + + diff --git a/public/app/VisitsHelper.html b/public/app/VisitsHelper.html new file mode 100644 index 0000000..a01f19a --- /dev/null +++ b/public/app/VisitsHelper.html @@ -0,0 +1,161 @@ + + + + + + +module VisitsHelper - Rails Application Documentation + + + + + + + + + + + + + + + + +
    +

    module VisitsHelper

    + +
    + +

    Helper de Visits

    + +

    Se encarga de apoyar a la clase Visits

    + +
    + + + + +
    + + + + + + + + + + +
    + +
    + + + + diff --git a/public/app/created.rid b/public/app/created.rid new file mode 100644 index 0000000..4fff6c1 --- /dev/null +++ b/public/app/created.rid @@ -0,0 +1,22 @@ +Fri, 27 Apr 2012 06:49:29 +0200 +doc/README_FOR_APP Wed, 28 Mar 2012 04:15:46 +0200 +app/controllers/application_controller.rb Fri, 27 Apr 2012 06:40:03 +0200 +app/controllers/comments_controller.rb Fri, 27 Apr 2012 06:47:05 +0200 +app/controllers/planet_controller.rb Fri, 27 Apr 2012 06:49:12 +0200 +app/controllers/sites_controller.rb Fri, 27 Apr 2012 06:47:34 +0200 +app/controllers/trips_controller.rb Fri, 27 Apr 2012 06:47:48 +0200 +app/controllers/types_controller.rb Fri, 27 Apr 2012 06:48:00 +0200 +app/controllers/visits_controller.rb Fri, 27 Apr 2012 06:48:15 +0200 +app/helpers/application_helper.rb Fri, 27 Apr 2012 06:41:31 +0200 +app/helpers/comments_helper.rb Fri, 27 Apr 2012 06:41:53 +0200 +app/helpers/planet_helper.rb Fri, 27 Apr 2012 06:42:15 +0200 +app/helpers/sites_helper.rb Fri, 27 Apr 2012 06:42:33 +0200 +app/helpers/trips_helper.rb Fri, 27 Apr 2012 06:42:48 +0200 +app/helpers/types_helper.rb Fri, 27 Apr 2012 06:43:09 +0200 +app/helpers/visits_helper.rb Fri, 27 Apr 2012 06:43:23 +0200 +app/models/comment.rb Fri, 27 Apr 2012 04:00:15 +0200 +app/models/site.rb Mon, 16 Apr 2012 04:38:40 +0200 +app/models/trip.rb Thu, 12 Apr 2012 16:27:52 +0200 +app/models/type.rb Thu, 12 Apr 2012 16:27:52 +0200 +app/models/user.rb Sun, 15 Apr 2012 23:43:15 +0200 +app/models/visit.rb Thu, 12 Apr 2012 16:27:52 +0200 diff --git a/public/app/doc/README_FOR_APP.html b/public/app/doc/README_FOR_APP.html new file mode 100644 index 0000000..1255c65 --- /dev/null +++ b/public/app/doc/README_FOR_APP.html @@ -0,0 +1,123 @@ + + + + + + +README_FOR_APP - Rails Application Documentation + + + + + + + + + + + + + + + + +
    + +

    Use this README file to introduce your application and point to useful +places in the API for learning more. Run “rake doc:app” to generate API +documentation for your models, controllers, helpers, and libraries.

    + +
    + + + + + diff --git a/public/app/images/add.png b/public/app/images/add.png new file mode 100755 index 0000000000000000000000000000000000000000..6332fefea4be19eeadf211b0b202b272e8564898 GIT binary patch literal 733 zcmV<30wVp1P)9VHk(~TedF+gQSL8D5xnVSSWAVY>J9b+m>@{iq7_KE}go~11+5s4;8hc+i0Xa zI1j@EX5!S+Me6HNqKzU5YQwL;-W5$p%ZMKMeR<%zp69-~?<4?8|C8S?bklXr4v&Ov zb&06v2|-x?qB`90yn>Qi%Sh2^G4n)$ZdyvTPf9}1)_buUT7>`e2G&2VU@~Bb(o+Mz zi4)>IxlSY${Dj4k={-9RzU^W5g9|2V5RZ2ZulL9s2xQbZ@r6eP9Ra5u(s|C0Nj#&4>wTSkb?%#=9?@ z^oxDy-O@tyN{L@by(WWvQ3%CyEu8x{+#Jb4-h&K9Owi)2pgg+heWDyked|3R$$kL@A z#sp1v-r+=G4B8D6DqsDH0@7OztA7aT9qc1Py{()w`m``?Y0&gi2=ROcc-9+nU^I6< zT=e_Y=vSnG@?3Ue{BW5ONFttcE!R-R_W4O01|0-|K-YNXLo2`4Qv z`r1LxR6#yf3FB%T95gJnaKKivA~Z}S9A(ZxEDK}O3T04USJ P00000NkvXXu0mjf^IS-S literal 0 HcmV?d00001 diff --git a/public/app/images/brick.png b/public/app/images/brick.png new file mode 100644 index 0000000000000000000000000000000000000000..7851cf34c946e5667221e3478668503eb1cd733f GIT binary patch literal 452 zcmV;#0XzPQP)Pdwe5?6tW?r-ok|b$oDQj8FV%kZPq;(MWOV8?8;<)(iP}>hNMU> z7fbz%jjlr7h8uuoQ~J6}n}@Y@PdTk=)PxO{%7zmL?dchpZX*~n;I{!C>*(8cU;q(~ zAS%Po_@naEU!xidrBXD?;hN|x^%W|Ij)0y*r5vi|?W&Fub(NqJ@z0o=O&SR3v>A``^efOSo-hEdApp;^Jd;9y!%1UfzX6Bh- z%-mbG|0Na{7Ruai_Y+DEb1s+b!*9k%Q!whMxjtZKA*?o;i1g&jy0@( zaU=-@d-h+o%gal6JRXEXA&L3`d2 z%jIxzZ~*p9O-;EJp_Ds0If38rM<5W8ic~K>FOK&2_p!CLg^i63OioVb6k$)zWHLx3 z5;!|M!}<9+#QSi1dRlbEcxPt^;cysUuU8@%3}RwpLRIGG<|IKnoyP6$Eh3SKw7a*r zSDXP=IYc&YZf;7@?fCe($^l9ORaJ3wbAx0uiC8QqRr$2t-Cfy8%XCI3B%pxJW>XdM zw~zPt_s}#A@pxQ5Ly)4szaMtH9lgE1SXx@b+S(fW`ub$fYPE8J7#bSNDzme*Ub07{ zQKV8SjEs!%0@v5ql8ggm!@$6Rbi^E8vBqpRM-}l+@5OSMrl+TWj*gC^qoV@>u{fQb zov5v?g~?>X@bEC&+uLPaQ&Ypn-y~^mZA}+f(&2EFH8eE%dU|@ENpN*_1-)L6_4Rc* zFuq@`IjX9vp1QiaK9ZojyZhnQURP99d=u;%37VRkpwsD4U0sd3x;hEQB&e^i|3QN0 z=H|Os1fRqaw!?#igLmS4HE!G3*ce(`TF} zlgUq0Q544c8(ae&UR$8ps&snq6^bPY3v3xAmMW74Di$h~GCH6E3TaYs2#6A<7K*gC z777H71_Wa;(dfp+g-drPCSWu)#PInZi72LJ;o?i~$-U=y&UbQ89Dul3%3P+Axkzc* zbH-y;QF=hR{qLItf%ci2_&e5wNo0gnVatG?ul6Zw=o$I9Ljfn*ic3`U?>IfEim3g{ zujU&$-hy6wn;w(xme|zJm;lWJxtTFfM)q0`kX!Vu0+d${$}LCddK1<^htTe-fUYL3 zB`SdNsZD>RgvLj1<^@h6_+cDRK2Brcr2~>%$*5S)hyV33PV^teac3%|4lz@8p4?)5 z?t5o^?q+%^%)Yygo~I^U4VR!bTnWuE35hcWrfCDR3q+sxJ79e7Fg`&)RCqLA^2^y^ z0laVfadW90_Fz8Brm|r47sB^u1VgI>kanj)Z4`zMSfHlm8>CwXa$JVM`$2RrmZB-3 zN10m-!;BvH*Br3V8t`DH7m`jf#2upVDXl{5ff18_pzCPK1Zu$$CKKvd8FGeFf)+K<|x33pc7P&S#3GZT4mEw;nr(Ze*F z3&*?-4U-lm*#tber5 z%S_ceqB`b3ko6r~BbvDwdohTvP(3a(pq{x#T$yQsu#OKwEe}KuH^Mh@nxg_(Nw136 zq#a^3xNBke)In+!?qk3%4wB69{pF`Tzg`07*qoM6N<$ Eg55P&8UO$Q literal 0 HcmV?d00001 diff --git a/public/app/images/bullet_black.png b/public/app/images/bullet_black.png new file mode 100644 index 0000000000000000000000000000000000000000..57619706d10d9736b1849a83f2c5694fbe09c53b GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$h^>lFz(Kw&{<9vg>5sw~gS5O!4 zr|{HuUFIBKiQyL}eBJ-L{`UVT|6_O~L{G%N{Wbre{kQtZ_0LvEhC#5QQ<|d}62BjvZR2H60wE-$h^mK6y(Kw&{<9vg>(S^W+6Zii9 z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz1H+_;eX)`ni0%X8XBDc-`=Ph(Uan2 zYsR{H!kvIN--9isvHznRsC#5QQ<|d}62BjvZR2H60wE-$h_H=O!(Kw&{<9vg>(S^W+6Zii9 z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz4q@v|B?28{s)#N@CGn3@%_y|zAV9T z66e<&B4?b6oF&azg|C(V&1ZbI_D}pL`}(^FT2yXwG1Ph~$Q@h8mJYOz!PC{xWt~$( F699+YQR)By literal 0 HcmV?d00001 diff --git a/public/app/images/date.png b/public/app/images/date.png new file mode 100644 index 0000000000000000000000000000000000000000..783c83357fdf90a1c7c024358e1d768b5c09c135 GIT binary patch literal 626 zcmV-&0*(ENP)5OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9 z7pD#bO_RUa>*faM`8;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9 z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D z-dh&rW&@X;1cS(45z)J&BVt+tv&GMVJ%!EiW) zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_ M07*qoM6N<$fC4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;yxzh{5!Htr?51 zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7 zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l z!7?%Uwib*ROP67Hw`ika)gX-(8Ia`-u_IEhxG7U<13kSsMW+$lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc literal 0 HcmV?d00001 diff --git a/public/app/images/find.png b/public/app/images/find.png new file mode 100644 index 0000000000000000000000000000000000000000..1547479646722bda4647df52cf3e8bc9b77428c6 GIT binary patch literal 659 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 Dl)1NK literal 0 HcmV?d00001 diff --git a/public/app/images/macFFBgHack.png b/public/app/images/macFFBgHack.png new file mode 100644 index 0000000000000000000000000000000000000000..c6473b324ee1dae1faaacc0826639833f551116c GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIEX7WqAsj$Z!;#Vf4nJ za0`Jjl>Qs8<JF;+Fd5q0wCR k?u=~bH}2*0f`J3~k>FVdQ&MBb@0BAfpf&c&j literal 0 HcmV?d00001 diff --git a/public/app/images/package.png b/public/app/images/package.png new file mode 100644 index 0000000000000000000000000000000000000000..da3c2a2d74bab159ba0f65d7db601768258afcb2 GIT binary patch literal 853 zcmV-b1FHOqP)5TQ^(M5v$(QKVE?W+9X! z*o}&~6c?_FreF)9NJB7b5Nbn{G0n4+%uJhR9(V5R|NFTpb|HgjefT!tIhLx@DR+N) zV+fHiR5Yt19}k|KnCsND{tH-`IMJ)3AE?OtyZ4>Un|6(d%h#JK`i&a7^xW9>`yBy` zS4SOHeOpC7$?hH5-#7Rswiue_8Ju*2N@$58=a#2OTA3png`w3v->gWif7t%e$ z$NLVS!tFT#8WL|Wa&K~+{%4P2cRfwesYV1_!F=3OaRVHl(>=`%&{x*s30c}#CNE@&;ItrAv!f!)Oy$Q9t$uS=(sD$-J{T*^(8Eez1E-l3}} zPrfHZ1`qsIFe&gipuL8-IZbo2Yg{lFGKs?ZZWcOaOdk*3`5T;$?AjbG1#`B510Er^h2)2r3Y{!8_2Gj=$KzuN5 zaErtW8W_Y2iJJjY)5pmTVJoPJYpanPOEuYHclM^C1F>${hFRpdi8a<2H|Xudf78bm(zwJ9`K%6I?q*Ua~ fW9JvIbn5*B+_J)rUMBs>00000NkvXXu0mjfH&TkY literal 0 HcmV?d00001 diff --git a/public/app/images/page_green.png b/public/app/images/page_green.png new file mode 100644 index 0000000000000000000000000000000000000000..de8e003f9fb8752c09e7f3655d5d8664b5c62fc3 GIT binary patch literal 621 zcmV-z0+RiSP)QqUjAtB;_Vvt6}AS_5YgM`Uqu`yva+H8^=4U$e4gHb}u zAQ2N{V3A%pO|?Pv?tb6z=jC}SiRa$G^v3q?*6XcYz$p|cq{uLj@#~Fi`J(>5{@&&N zy%T^+;>8cXx%|o77anP?&W1?1A(>-T49z9pyeCl@7YI+Si zKti7=B~``}TImz(G{0PnlQA3P#MAd}sorMjkP!50B7$nAkU^%#nl{Q9lW0@}9fE-> zN(q7tRuiC_T1r|BBtVBTlQ2+70$Rf;eF`Z;lx46Cpu-rEgb)EBKq(b^W8l<^We(`D z43?0=01z<3G6+UUv6`CsWCk6^93!#+<;ws7007{zS3k2k9-zZKFO~(k`>s0y006+1 zgF_jyIhsL-`FMf~JL~C=cV75(CrJ|q;MVO961G=O zm9d)YpJg5g(4i_HKL75eSE}mq$Y}r}hyVdcV~p>6a}oXr80q`oj%+s700000NkvXX Hu0mjfPs|!l literal 0 HcmV?d00001 diff --git a/public/app/images/page_white_text.png b/public/app/images/page_white_text.png new file mode 100644 index 0000000000000000000000000000000000000000..813f712f726c935f9adf8d2f2dd0d7683791ef11 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%6;pyTSA|c6o&@eC9QG)Hj&ExYL zO&oVL^)+cM^qd@ApywS>pwx0H@RDN}hq;7mU-SKczYQ-hnrr=;iDAQMZQ+*g=YOM= z!QlMQEn7FbaD->uKAYgo_j9)W&$$zS*W9}m(ey0q$&7l-XEWO0Y(9M=SnhLbwy;d>@~SY$Ku*0xPvIOQeV1x7u_z-2-X>_74(yfh7C znXL|3GZ+d2`3re2hs?MKC#5QQ<|d}62BjvZR2H60wE-$R?&;zfqH(@;q9b3Efq-lM(nr^( z=EYR73-9e)UYMWsXy%?aZsD68Yyv^2$~6QgEcljw%kx>O(f-gQ?@fOOx3A-0+Qw?O zRx~W)kn~Qe2d6f9nMG#g9Q04Mk==M~N!Dglvxk!fgVh#w@ZV$IY1+Xc`d{d2UcaP~ zfWp)_Ivqj}l2SPy^9ZWy6rG9Yx4v67_uA&&9|XA~5-#3)W3%em1peD8RWH^#O%XoM zxMPud%}GTj#~*+7JMxTd!`{^Q+>(D3*|@KV`*G2;{QnANOxu1$r2xIe;OXk;vd$@? F2>@zac~<}c literal 0 HcmV?d00001 diff --git a/public/app/images/plugin.png b/public/app/images/plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..6187b15aec001b7080b51a5f944f07591f26cc15 GIT binary patch literal 591 zcmV-V0eEcNHZMNv|IbJ-M`( zKwWL~opzjJe^WpCmV9E;(0&ut2;4va_(#>M8)>9$R5viQnf(Nkh~VM$y>J(jqb$cj z+nL1Nm|mV)Gm|9MnHf*7Ja4OEAQz__^LRKOLEwqpiGV^^A*T=#&inGm-62Xs;dnSp zKj&H9T*boh2i)W+(n27l!C)>fq|L%VB1i ziC4p;NwV_}ZjW7$LRW#(_bKF#hp=!IqNO26Z*w2+LEwx{PVnZ&Sn}T;mtzb$;qA*nT@@+ zV5uQ@iXDTPoTbV#FRr~z04|PPh`wXTNoCm9*tG&?e3+fYl>K6+&3|Cc$KOpL`ER+_ dcRl5U#9zn6ZO}GFk7R5;7c zlif>`Q5?tj7Yw@ZCMtTF^Q|ZedeJhM%QPCR*bs8V79p$QTo7e94yQNXRs-{0?hOn_-8n0AMO@u1Ts zNl8QzJs1#rz%RBt?ux>l+amAvh+J!{$lkaqv}+Erb-6j2xp>K4GLQnNB*W`hFg*?P z^AL@~(h~Z+wfcWEXHqV^Tq-#z$7Y#o0;yFxA!00F}F2dX# zjE$iOgT#G4*1TR6kB1Gnn@>$meCh2a>c5YuIvFn-R2W@>4@M*m@-|jiDV?b)bccgA zyPfsMM!rjy>+1O2)5Eg29Z_*2p&qGnmS!OH?vZ(4>QB01d>j%9n4QINxkyT(Dos?I zjaWF$*IQmh`SF-?xU%xMEfjq1=6qY*g&lgG_cXv$BGoIWyfO5 zp>pdV*O+y=&6@N2WWFo(%RtT`Q(H^6zn^a%epE~Kx^mEJ{c8`luC$nc*z9j|4Ms8aJK-ladKLpnAK z!yd|CC&>l1b7`m$MH$ScEIP@XgT41O>|DzL{-38CH68OyX#u=G?d7;y&_o&o)f@3U z2(tr%Ok88caOL`xiQA8o;Vzr-$A$SOu6o|$&0DQAJ1Z7?OACaeoy+)PWu&~aueW<| z*KW^(^2}#30u*~<_mXScFNd6U&sxh5*GGMNytZGxkIGqL%v6329^u`FD6T?b?K!4B z@Hzh?O2Au=((Gu;rvgLMt^pS|u1rEkBgC8$oH%zgT`TvZiK#VDrVG?-i~6a_+WZb> zc1>>lb)xcuo^Cl8k%q3c_d*It_Vtj>RSovF&w;hS=6uYrT2e@-@l@P~uBN`zu!v>e zTm(is&jcQ6vuP?|;!e+(n8w)-Xjd!hwk@r2D0i00ygdKo2Xvs?&w_lajj5DHS@9I! z;_&ji2e{!uusGnVn};Pu|dl5x-FhQyC8^-4Uo_;BLiOXzcE z&4PS2TBWSC=hsw0og;z#(mly@Ed2E1E$_VDaM?kloE4ob2XK&K;OS~-nhIGlA4~UZrJu6*|}wi#TT?|yWUH+_&n($t0xta zBwTzSfE)uAw*L0>+`pTps}L-$jIP5Q_E$Am+l|{XfsKr0Vi~`Em?SJQ#0y)8vsxb1 zMdxJl^){_CDwI^}>)Pw${G?Ajc@P}x{Fvhoi0jbY^427?KPmoA_G)sqK}u$2(79Xg zC%}xm5JDcrsm5^vQEQpGEdJDc^yfuNAlqV1pZQVkOSceV<|{=|=@?=o4i_1RFUZth zC7cu<6%V3dVCI}P6DL4iUgTc@&(nXY)ox}HZ z(a#EgiNj%{kjRLL2t?{m_aKN`{5-&u+HAtQ-Qq#@!I@<(M+B3i@|g=LY6 z90tpW!JuMn_Lcy1q7g&LUSuLE3XS}K#P^nHVUmL`L)dbP| z0bt(+Cp#M-bH!LM*DzJ0Lfn;eTBV@|JvGSgpdoc1RhhV>(G-2(vE|>MrVgA9+?+0m4OzUqbT>-U-jg|v zLZMntq`r?fy1UCMh>z2Koi1SL-~N2ZrIf+dZW|;SWszsde}Dl!HOMc1Fa>K9)e&RI z)A?aK zcviCdKDUg_%#u7YAE`A`Y3$(P4&m^@fEWAvjAwVmRWeUnmkrxA;E!fKoc{9Vi=lvFL}KmoS;g* zdjL?Y!VHUFq63aLj6VZE+tHts?Z1pFkiO9^k*5pGpFpU&5#5G4ATd{t>a&9zKBVB9=Ns^HFU|DTGH8C+Xr2UqOU`Zxe)!|%j4=-QojGePq)pRGe;!f)Czk!u3vP_Jxu8(e6 zf4Q`F$Qio2Jw@N*E@k?c`+Sw}AYQjkT+x)OAe6eq(AT!iRuksKQn%Ao_Ac1T-p#Js I_CnHs0qX}mlmGw# literal 0 HcmV?d00001 diff --git a/public/app/images/tag_green.png b/public/app/images/tag_green.png new file mode 100644 index 0000000000000000000000000000000000000000..83ec984bd73364134da0f98d27a800c5d3264180 GIT binary patch literal 613 zcmV-r0-F7aP)^5T)AZ%#@G{_P{NCN^P z(J0zvSn~SSm(Ur);-M~8^*;61*VRI`T1BN&LAhK;sZ>I-SVW;vfUfJv=ko^ugnc0x zhJodBxe>iyk3%w<%wC8holUJ4(iv>tL{`DQt zPOsyUbO_Cmc&*iHkqbm3ku`|GcC^OhF>jj9W*GkH;^g!iUVpib_h*=@udp4h(P+e*zL_~ZmJjh(y^BxULwq>9zXoYE8sq{#pN~U0C6!8vY)5N2 z9P*}mw}7X$O^qTtJef1ACWvJT9^wt-)Zh0r~j#0bT`f;-zv6 z^Tmw22!%rMcs!TaUX<-8s;X-B`+Xbo+_uWuFa z1yIPc?DTrQ7KvRhmt*TG|L=EYQ=LqFX;=Lp`4}jx6BE-@00000NkvXXu0mjf=s_29 literal 0 HcmV?d00001 diff --git a/public/app/images/transparent.png b/public/app/images/transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..d665e179efd797451084235f105425247fea0a14 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;bAV5X>;M1%mmiTn0pv241o;Is pI6S+N2ITN~x;Tb#$R;N!@B(=T42&&nK2`x)44$rjF6*2UngG277DE64 literal 0 HcmV?d00001 diff --git a/public/app/images/wrench.png b/public/app/images/wrench.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8213fef5ab969f03189d4367e32e597e38bd7f GIT binary patch literal 610 zcmV-o0-gPdP)^jb z4`0v}DG1te)wmeb(>p90leRz?_mO+^JKy=v&2<29Od6?F%9%(c8los#f*@G`-%W&* z$)uBj2i@u-@SgX}gtyWPe6d*|w6h%R? zScK2#Yn%$sum0cy>90DmY*i{1XqpClEtktsRTZ)lCUe z<FogV^*tm>8*AlX za4oiR!&85LrobG57qUHUX#{>Vz(RHpB5|@>9O6N$jqB8>%($0wxE5R3)b>Y~xtCo$ zCgEk&A?_#IxHdN)9tqre^o{ho4{?hmPuf@^@I3-wncaRd%|~O3xbrKY=&TiwPYkJroM{;WUQTuMY8vpg}f4o)2%U3C;eEDoiEh?94d(rV57VIF#8VqzW$HrDC|#U`x@QDbgi zVl)t9GGz&YY#D?gc%>hISA+_EBpnXt#pnC`p6@xw0$8TCbULjhlgVx(kuc)%xbgqq zR5+DNDFRN0!y)7Gm}oT0i39}h4h928qY?Rho^UvPGJ#kuW|-Amtrn`Pmd&+bFo@sp z$LI4IQw7BG?|#2ewOS<<3VjL$0=lMY^m;wqZujv5kx1l%Sl;V&Iy4#$ip3&@LV2!7vhhN=PCz%^9v24`qb(+m4W?!q-&~=?ssf5GfnAmJKV;3bvpDm0(NhahZ=&^sqo6Odj6>)Dq_3p~4~ zvb`d3Mydwjt&Df^hVmLtI2x=U&h9(JVYX-!y~z3zi;1>=LY;o(bL$(Yf$lf)dMf0-u^0HrpTG Wk@)HE*94aU0000m+BBgry{~j2fHLegbHP( zrgXNbr0}2;^nywdjLjZe?uxtrd3D(pZH@fFFc0{BW_~jxoO1w7-VX;6vK@ROA$$R6 zEmo;Ht-Mj|>5jUy{bQ^V5@53LRI8AgLpUm|m+15sqcz@QtVSo|oz7ArM8?pIn+>gN z0b=4_b5O|4A*;Q+vc9Vqr~%3V155*NV~@gTz}KSUiKB-uJzjMZ>5%Q#n24H!V{ zTY(LLAE*NAHZ}C#wnj%Bw5OFIkRhkkAW#kDC3j9Wm0YXRaXlyyp>#mVfYG)eC;@ab zDb=T-BCAY4LI(Z@GOTr2V_A{pRwSmz+8Be>CjAw(=gnbVWAeguvZa93JmL(EDxv1m z0OP4q=fpAK1Mq!C2`OkEn37o;m#wF#(t(8Pu#S?2f#x<~4EO{@fmm`p9veD6RZ_jp z@Au4};q&`XuKEYgIiB4((kgxOs#YdqJw0fY>9^K_agEu5+$#k;w#%I2N>n_?)YIqu z`tq&#_^p?-%K*U0^}|7+9U(&k0?s;=r=uCZ%)H9_edH8wK}gB(nUB1FFk+2Ol%BXV zHoFY`D~2x|2 + + + + + +Rails Application Documentation + + + + + + + + + + + + + + + + +

    This is the API documentation for Rails Application Documentation. +asaasa + +

    +

    Proyecto Planet

    + +
    + +

    Resumen del proyecto

    +

    El proyecto planet2012 pretende ser una red social de viajes, lugares y sitios. El usuario podrá crear sitios en los que ha estado o planea estar para así poder planificarse viajes.

    + +

    Conocimientos adquiridos

    +
    +
      +
    • Ruby on Rails
    • +
    • Gestionar proyectos mediante git
    • +
    • Tecnología sqlite
    • +
    • Tecnología html.erb
    • +
    • Modelo vista controlador
    • +
    • Desplegar servicios web online mediante la plataforma Heroku
    • +
    • HTML5 Canvas
    • +
    • API de google maps
    • +
    • Testing
    • +
    • Gema de autenticación Devise
    • +
    • Aplicación directa de conocimientos previos html, javascript, Ruby
    • + +
    +

    Resumen detallado de las prácticas

    +

    Práctica 1:

    +

    Añadir las siguientes mejoras al commit "df46232 se añade seeds.rb" proyecto planet:

    +

    1) Definir una nueva acción en el controlador planet, denominada “author”. La nueva acción debe dar acceso a una página Web con los datos de los autores de este portal Web, incluyendo

    +

    - nombre, direccion postal y electrónica, foto y breve curriculum

    +

    2) Definir tests de funcionalidad para ejemplo y author, y comprobar que los tests pasan correctamente

    +

    3) Añadir a las vistas index.html.erb y show.html.erb de”types” la fecha en la que fueron modificados por última vez

    +

    - Dicha fecha está accesible en el campo “updated_at” de los objetos de la BBDD (ver fichero schema.rb)

    +

    4) Añadir una nueva acción al controlador de “types” denominada “ordered_index”, que liste los monumentos ordenados alfabeticamente por nombre. Utilizar función Type.find(:all, :order => :name)

    +
      +
    • El nuevo controlador debe atender a comando HTTP: "GET /types/ordered_index" (o con otro URL)
    • +
        +
      • Se debe definir la nueva ruta
      • +
          +
        • La vista y controlador pueden definirse nuevos o también se pueden reutilizar los de index
        • +
        +
      +
    +

    5) Incluir 6 hiperenlaces en parte superior e inferior de todas las páginas, enlazados con:

    +
      +
    • planet/index
    • +
    • planet/contact
    • +
    • planet/ejemplo
    • +
    • planet/author
    • +
    • types/index
    • +
    • types/ordered_index
    • +
    +

    Se recomienda definir hiperenlaces utilizando path_helpers, por ejemplo: <%= link_to('Index', planet_index_path) + ... %> en “app/views/layouts/application.html.erb” antes y despues de <% yield %>

    +

    6) Integrar todas las modificaciones en un clón de ging/planet y hacer un pull request a ging/planet con las modificaciones

    + +

    Práctica 2:

    + +

    Crear una tabla de gestión de comentarios de los sitios que pueda contener comentarios de 240 caracteres como máximo.

    +

    Cada comentario pertenecerá a un usuario y a un sitio por lo que deberá crease una tabla con 3 campos ("coment:string", "user_id:integer" y site_id:integer") que relacione cada comentario con un sitio y un usuario.

    +

    Un usuario podrá tener muchos comentarios y un sitio tambien podra tener muchos comentarios, por lo que habra que definir una relación uno_a_muchos entre comentarios y sitio, y entre comentarios y usuario.

    +

    La vista de la lista de sitios ("index") deberán modificarse para que si existen comentarios a un sitio, aparezca al final de la descripción la palabra comentarios, resaltada en negrita con un hiperenlace a la lista de comentarios.

    +

    La vista de un sitio ("show") deberán modificarse para que si existen comentarios a un sitio, estos se adjunten al final de la descripción del sitio.

    +

    La lista de comentarios incluirá el nombre del autor al principio, seguido de “: ” y del comentario. Las acciones deberán estar filtradas para que reflejen correctamente los permisos, es decir, solo los autores de un comentario podrán editarlo o borrarlo.

    +

    Justo detras de los comentarios aparecerá el texto "Añada su comentario" con un campo de entrada de comentario y un boton de “nuevo comentario”.

    +

    Nota. http://guides.rubyonrails.org/getting_started.html añade comentarios a posts de un blog (similar). + +

    Práctica 3:

    +

    Añadir a la tabla de sitios la captura automatica de sus coordenadas, de forma que al crear un sitio y utilizando el API de geoposicionamiento de HTML5 se añadan las coordenadas obtenidas al sitio.

    +
      +
    • Las coordenadas obtenidas deberan poder ser editadas por el usuario en el formulario
    • +
    • Habra que enriquecer también la tabla de sitios con 3 nuevos campos: longitud, latitud y zoom, doinde guardar dichos valores.
    • +
    +

    Añadir ademas:

    +
      +
    1. A cada sitio de planet un mapa (de Google Maps), que muestre su posicion en el mapa.
    2. +
    3. A cada viaje de planet un mapa (de Google Maps), que muestre la foto de todas las visitas del viaje geoposicionados en sus coordenadas en el mapa
    4. +
    +

    Indicar ademas para cada sitio (lista de sites), el número de veces que ha sido incluido en algún viaje, tanto en la vista individual, como en la lista de sitios.

    + +

    Práctica 4

    +

    Añadir a planet un buscador de sitios y viajes que este en todas las páginas en el mismo lugar (en application.html.erb)

    +

    El buscador tendra un cajetín para introducir un string de 3 o mas caracteres. Tendrá además un botón para lanzar la busqueda de sitios y viajes que contengan el string en el nombre o en la descripción.

    +

    La lista de sitios y viajes se presentará en 2 apartados, el primero contendrá los sitios y el segundo los viajes encontrados.

    +

    Se recomienda asociar la acción de busqueda al controlador planet, debido a que integra vistas parciales de sites y trips.

    +

    Además hay que arreglar todos los tests generados por rails para que pasen correctamente al ejecutar “rake test”. Y añadir un test de funcionalidad para la nueva acción buscar.

    +

    Por último se deberá documentar las páginas de esta entrega en formato RDoc y ejecutar “rake doc:app” para generar doc del proyecto.

    +

    La documentación generada se deberá enlazar con una nueva entrada de la barra de navegación.

    +

    También se deberá desplegar el proyecto en Heroku.

    + + + + + + + diff --git a/public/app/js/darkfish.js b/public/app/js/darkfish.js new file mode 100644 index 0000000..4be722f --- /dev/null +++ b/public/app/js/darkfish.js @@ -0,0 +1,153 @@ +/** + * + * Darkfish Page Functions + * $Id: darkfish.js 53 2009-01-07 02:52:03Z deveiant $ + * + * Author: Michael Granger + * + */ + +/* Provide console simulation for firebug-less environments */ +if (!("console" in window) || !("firebug" in console)) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", + "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; + + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +}; + + +/** + * Unwrap the first element that matches the given @expr@ from the targets and return them. + */ +$.fn.unwrap = function( expr ) { + return this.each( function() { + $(this).parents( expr ).eq( 0 ).after( this ).remove(); + }); +}; + + +function showSource( e ) { + var target = e.target; + var codeSections = $(target). + parents('.method-detail'). + find('.method-source-code'); + + $(target). + parents('.method-detail'). + find('.method-source-code'). + slideToggle(); +}; + +function hookSourceViews() { + $('.method-heading').click( showSource ); +}; + +function toggleDebuggingSection() { + $('.debugging-section').slideToggle(); +}; + +function hookDebuggingToggle() { + $('#debugging-toggle img').click( toggleDebuggingSection ); +}; + +function hookTableOfContentsToggle() { + $('.indexpage li .toc-toggle').each( function() { + $(this).click( function() { + $(this).toggleClass('open'); + }); + + var section = $(this).next(); + + $(this).click( function() { + section.slideToggle(); + }); + }); +} + +function hookSearch() { + var input = $('#search-field').eq(0); + var result = $('#search-results').eq(0); + $(result).show(); + + var search_section = $('#search-section').get(0); + $(search_section).show(); + + var search = new Search(search_data, input, result); + + search.renderItem = function(result) { + var li = document.createElement('li'); + var html = ''; + + // TODO add relative path to + + + + + + + + + + +

    Table of Contents - Rails Application Documentation

    + +

    Pages

    + + +

    Classes/Modules

    + + +

    Methods

    + + + + + diff --git a/public/doc.html b/public/doc.html new file mode 120000 index 0000000..930501a --- /dev/null +++ b/public/doc.html @@ -0,0 +1 @@ +/Users/carloscrespog/Documents/SWCM/planet2012/doc/app/index.html \ No newline at end of file From 3f74fb2aba547ff397699b78b6be39df71cf4ead Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Fri, 27 Apr 2012 09:20:41 +0200 Subject: [PATCH 17/17] Entrega final retocado estilo --- app/assets/stylesheets/planet.css | 14 ++++++++++++-- app/views/layouts/application.html.erb | 18 +++++++++++------- app/views/layouts/special_layout.html.erb | 1 - 3 files changed, 23 insertions(+), 10 deletions(-) delete mode 100644 app/views/layouts/special_layout.html.erb diff --git a/app/assets/stylesheets/planet.css b/app/assets/stylesheets/planet.css index fb9eedf..da31419 100644 --- a/app/assets/stylesheets/planet.css +++ b/app/assets/stylesheets/planet.css @@ -176,8 +176,18 @@ font-size: 1.3em; } .user a:visited{ - color: white; + color: black; } .user a{ - color: white; + color: black; +} +#search{ + position:absolute; + right:0px; + width:300px; + color: black; + font-size: small; +} +#shortcuts{ + } \ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index adeb3df..248e3e7 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -26,15 +26,11 @@ <% else %> <%= link_to "Sign in", new_user_session_path %> <% end %> +
    - +
    +
    @@ -60,6 +56,14 @@ <%= link_to "Contact", planet_contact_path %> <%= link_to "Documentación", "/app/index.html" %> <%= link_to "Sign up", new_user_registration_path if !current_user %> + +
    +

    <%= notice %>

    <%= alert %>

    diff --git a/app/views/layouts/special_layout.html.erb b/app/views/layouts/special_layout.html.erb deleted file mode 100644 index fe6ac47..0000000 --- a/app/views/layouts/special_layout.html.erb +++ /dev/null @@ -1 +0,0 @@ -special_layout.html.erb \ No newline at end of file