From c15187e7461abaf96dced99ac144d59236263611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Thu, 22 Mar 2012 15:36:24 +0100 Subject: [PATCH 01/56] Funcion author, hiperenlaces y test de funcionalidad --- app/assets/images/marina.JPG | Bin 0 -> 7010 bytes app/controllers/planet_controller.rb | 3 + app/controllers/planet_controller.rb~ | 14 +++++ app/views/layouts/application.html.erb | 9 +++ app/views/planet/author.html.erb | 13 ++++ app/views/planet/author.html.erb~ | 13 ++++ app/views/planet/ejemplo.html.erb | 4 +- app/views/planet/ejemplo.html.erb~ | 3 + config/routes.rb | 2 + config/routes.rb~ | 70 +++++++++++++++++++++ test/functional/planet_controller_test.rb | 10 +++ test/functional/planet_controller_test.rb~ | 14 +++++ 12 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 app/assets/images/marina.JPG create mode 100644 app/controllers/planet_controller.rb~ create mode 100644 app/views/planet/author.html.erb create mode 100644 app/views/planet/author.html.erb~ create mode 100644 app/views/planet/ejemplo.html.erb~ create mode 100644 config/routes.rb~ create mode 100644 test/functional/planet_controller_test.rb~ diff --git a/app/assets/images/marina.JPG b/app/assets/images/marina.JPG new file mode 100644 index 0000000000000000000000000000000000000000..f30dee36f54c457b017907b72a6d41eeb0ed48d4 GIT binary patch literal 7010 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 literal 0 HcmV?d00001 diff --git a/app/controllers/planet_controller.rb b/app/controllers/planet_controller.rb index be7ac0a..d5a271e 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/controllers/planet_controller.rb~ b/app/controllers/planet_controller.rb~ new file mode 100644 index 0000000..d5a271e --- /dev/null +++ b/app/controllers/planet_controller.rb~ @@ -0,0 +1,14 @@ +class PlanetController < ApplicationController + def index + end + + def contact + end + + def ejemplo + end + + def author + end + +end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 062c0a4..0ca6011 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -8,7 +8,16 @@ +<%= link_to('Index', planet_index_path) %> +<%= link_to('Contact', planet_contact_path) %> +<%= link_to('Ejemplo', planet_ejemplo_path) %> +<%= link_to('Author', planet_author_path) %> + <%= yield %> +<%= link_to('Index', planet_index_path) %> +<%= link_to('Contact', planet_contact_path) %> +<%= link_to('Ejemplo', planet_ejemplo_path) %> +<%= link_to('Author', planet_author_path) %> diff --git a/app/views/planet/author.html.erb b/app/views/planet/author.html.erb new file mode 100644 index 0000000..1c70c5e --- /dev/null +++ b/app/views/planet/author.html.erb @@ -0,0 +1,13 @@ +

Autores del sitio WEB

+ +<%= image_tag('marina.JPG') %> + +

Nombre: Marina González

+ +

Dirección postal: Paseo Juan XXIII, Madrid

+ +

email: m.gonzalezc@alumnos.upm.es

+ +

Currículum: Estudiante de Ingeniería Superior de Telecomunicación.

+ + diff --git a/app/views/planet/author.html.erb~ b/app/views/planet/author.html.erb~ new file mode 100644 index 0000000..d08b865 --- /dev/null +++ b/app/views/planet/author.html.erb~ @@ -0,0 +1,13 @@ +

Autores del sitio WEB

+ +<%= image_tag('marina.JPG') %> + +

Nombre: Marina González

+ +

Dirección postal: Paseo Juan XXIII, Madrid

+ +

email: m.gonzalezc@alumnos.upm.es

+ +

Currículum: Estudiante de Ingeniería Superior en la ETSIT.

+ + diff --git a/app/views/planet/ejemplo.html.erb b/app/views/planet/ejemplo.html.erb index cb05eb9..88a3093 100644 --- a/app/views/planet/ejemplo.html.erb +++ b/app/views/planet/ejemplo.html.erb @@ -1,3 +1 @@ -

ERb: Extended Ruby

El formato ERb o .erb es HTML extendido con anotaciones Ruby, delimitadas por <% o <%= y %> , como en el siguiente ejemplo
  • Anotación no visible: <% "esto NO se ve" %>
  • Anotación visible: <%= "esto SI se ve" %>
  • Anotación no visible: <% t=Time.now %>
  • Anotación visible: <%= "hoy es: " + t.to_s %>
- -

También podemos generar un enlace al recurso (página) Home con el siguiente hiperenlace: <%= link_to('Home', planet_index_path) %>

Rails ejecuta el código Ruby y lo inserta en la página HTML antes de generar la página.

\ No newline at end of file +

ERb: Extended Ruby

El formato ERb o .erb es HTML extendido con anotaciones Ruby, delimitadas por <% o <%= y %> , como en el siguiente ejemplo
  • Anotación no visible: <% "esto NO se ve" %>
  • Anotación visible: <%= "esto SI se ve" %>
  • Anotación no visible: <% t=Time.now %>
  • Anotación visible: <%= "hoy es: " + t.to_s %>

También podemos generar un enlace al recurso (página) Home con el siguiente hiperenlace: <%= link_to('Home', planet_index_path) %>

Rails ejecuta el código Ruby y lo inserta en la página HTML antes de generar la página.

\ No newline at end of file diff --git a/app/views/planet/ejemplo.html.erb~ b/app/views/planet/ejemplo.html.erb~ new file mode 100644 index 0000000..cb05eb9 --- /dev/null +++ b/app/views/planet/ejemplo.html.erb~ @@ -0,0 +1,3 @@ +

ERb: Extended Ruby

El formato ERb o .erb es HTML extendido con anotaciones Ruby, delimitadas por <% o <%= y %> , como en el siguiente ejemplo
  • Anotación no visible: <% "esto NO se ve" %>
  • Anotación visible: <%= "esto SI se ve" %>
  • Anotación no visible: <% t=Time.now %>
  • Anotación visible: <%= "hoy es: " + t.to_s %>
+ +

También podemos generar un enlace al recurso (página) Home con el siguiente hiperenlace: <%= link_to('Home', planet_index_path) %>

Rails ejecuta el código Ruby y lo inserta en la página HTML antes de generar la página.

\ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 4cd1976..9e0930a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,6 +7,8 @@ get "planet/ejemplo" + get "planet/author" + # The priority is based upon order of creation: # first created -> highest priority. diff --git a/config/routes.rb~ b/config/routes.rb~ new file mode 100644 index 0000000..64b2703 --- /dev/null +++ b/config/routes.rb~ @@ -0,0 +1,70 @@ +Planet::Application.routes.draw do + resources :types + + get "planet/index" + + get "planet/contact" + + get "planet/ejemplo" + +get "planet/author" + + # The priority is based upon order of creation: + # first created -> highest priority. + + # Sample of regular route: + # match 'products/:id' => 'catalog#view' + # Keep in mind you can assign values other than :controller and :action + + # Sample of named route: + # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase + # This route can be invoked with purchase_url(:id => product.id) + + # Sample resource route (maps HTTP verbs to controller actions automatically): + # resources :products + + # Sample resource route with options: + # resources :products do + # member do + # get 'short' + # post 'toggle' + # end + # + # collection do + # get 'sold' + # end + # end + + # Sample resource route with sub-resources: + # resources :products do + # resources :comments, :sales + # resource :seller + # end + + # Sample resource route with more complex sub-resources + # resources :products do + # resources :comments + # resources :sales do + # get 'recent', :on => :collection + # end + # end + + # Sample resource route within a namespace: + # namespace :admin do + # # Directs /admin/products/* to Admin::ProductsController + # # (app/controllers/admin/products_controller.rb) + # resources :products + # end + + # You can have the root of your site routed with "root" + # just remember to delete public/index.html. + # root :to => 'welcome#index' + + root :to => "planet#index" + + # See how all your routes lay out with "rake routes" + + # This is a legacy wild controller route that's not recommended for RESTful applications. + # Note: This route will make all actions in every controller accessible via GET requests. + # match ':controller(/:action(/:id(.:format)))' +end diff --git a/test/functional/planet_controller_test.rb b/test/functional/planet_controller_test.rb index 88229e0..c2e7348 100644 --- a/test/functional/planet_controller_test.rb +++ b/test/functional/planet_controller_test.rb @@ -11,4 +11,14 @@ class PlanetControllerTest < ActionController::TestCase assert_response :success end + test "should get ejemplo" do + get :ejemplo + assert_response :success + end + + test "should get author" do + get :author + assert_response :success + end + end diff --git a/test/functional/planet_controller_test.rb~ b/test/functional/planet_controller_test.rb~ new file mode 100644 index 0000000..88229e0 --- /dev/null +++ b/test/functional/planet_controller_test.rb~ @@ -0,0 +1,14 @@ +require 'test_helper' + +class PlanetControllerTest < ActionController::TestCase + test "should get index" do + get :index + assert_response :success + end + + test "should get contact" do + get :contact + assert_response :success + end + +end From ac705fc5e06c95c943fab5625254fdfd0c809ff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Sun, 25 Mar 2012 11:50:31 +0200 Subject: [PATCH 02/56] modificar vista pagina author --- app/assets/images/Daniel.jpg | Bin 0 -> 12951 bytes app/views/planet/author.html.erb | 28 ++++++++++++++++++++++------ app/views/planet/author.html.erb~ | 28 ++++++++++++++++++++++------ 3 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 app/assets/images/Daniel.jpg diff --git a/app/assets/images/Daniel.jpg b/app/assets/images/Daniel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce0bc60dc6fea752d9efd696ea4587dbdb6db974 GIT binary patch literal 12951 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%0DB9x}dOk8rguvLou2)dqm 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 literal 0 HcmV?d00001 diff --git a/app/views/planet/author.html.erb b/app/views/planet/author.html.erb index 1c70c5e..7863b7c 100644 --- a/app/views/planet/author.html.erb +++ b/app/views/planet/author.html.erb @@ -1,13 +1,29 @@

Autores del sitio WEB

-<%= image_tag('marina.JPG') %> +
    + <%= image_tag('Daniel.jpg') %> +
  • Nombre: Daniel García León
  • +
  • Dirección: Calle Ramiro de Maeztu, 2
  • +
  • Mail: dgarciale@gmail.com
  • +
  • Curriculum: +
      +
    • Estudiante de 4º de Ingeniería en Telecomunicación en la Universidad Politécnica de Madrid.
    • +
    +
  • +
-

Nombre: Marina González

+
    + <%= image_tag('marina.JPG') %> +
  • Nombre: Marina González
  • +
  • Dirección postal: Paseo Juan XXIII, Madrid
  • +
  • Mail: m.gonzalezc@alumnos.upm.es
  • +
  • Currículum: +
      +
    • Estudiante de 4º de Ingeniería en Telecomunicación en la Universidad Politécnica de Madrid.
    • +
    +
  • +
-

Dirección postal: Paseo Juan XXIII, Madrid

-

email: m.gonzalezc@alumnos.upm.es

- -

Currículum: Estudiante de Ingeniería Superior de Telecomunicación.

diff --git a/app/views/planet/author.html.erb~ b/app/views/planet/author.html.erb~ index d08b865..7863b7c 100644 --- a/app/views/planet/author.html.erb~ +++ b/app/views/planet/author.html.erb~ @@ -1,13 +1,29 @@

Autores del sitio WEB

-<%= image_tag('marina.JPG') %> +
    + <%= image_tag('Daniel.jpg') %> +
  • Nombre: Daniel García León
  • +
  • Dirección: Calle Ramiro de Maeztu, 2
  • +
  • Mail: dgarciale@gmail.com
  • +
  • Curriculum: +
      +
    • Estudiante de 4º de Ingeniería en Telecomunicación en la Universidad Politécnica de Madrid.
    • +
    +
  • +
-

Nombre: Marina González

+
    + <%= image_tag('marina.JPG') %> +
  • Nombre: Marina González
  • +
  • Dirección postal: Paseo Juan XXIII, Madrid
  • +
  • Mail: m.gonzalezc@alumnos.upm.es
  • +
  • Currículum: +
      +
    • Estudiante de 4º de Ingeniería en Telecomunicación en la Universidad Politécnica de Madrid.
    • +
    +
  • +
-

Dirección postal: Paseo Juan XXIII, Madrid

-

email: m.gonzalezc@alumnos.upm.es

- -

Currículum: Estudiante de Ingeniería Superior en la ETSIT.

From 3330689198b0e60de43d7c2fa0c93ab26a75d663 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Sun, 25 Mar 2012 13:11:04 +0200 Subject: [PATCH 03/56] =?UTF-8?q?a=C3=B1adir=20types,=20modificar=20vista?= =?UTF-8?q?=20show?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/types/index.html.erb | 4 ++++ app/views/types/index.html.erb~ | 29 +++++++++++++++++++++++++++++ app/views/types/show.html.erb | 5 +++++ app/views/types/show.html.erb~ | 20 ++++++++++++++++++++ 4 files changed, 58 insertions(+) create mode 100644 app/views/types/index.html.erb~ create mode 100644 app/views/types/show.html.erb~ diff --git a/app/views/types/index.html.erb b/app/views/types/index.html.erb index 50bda49..acec33b 100644 --- a/app/views/types/index.html.erb +++ b/app/views/types/index.html.erb @@ -23,3 +23,7 @@
<%= link_to 'New Type', new_type_path %> + +
+ +
diff --git a/app/views/types/index.html.erb~ b/app/views/types/index.html.erb~ new file mode 100644 index 0000000..72c949a --- /dev/null +++ b/app/views/types/index.html.erb~ @@ -0,0 +1,29 @@ +

Listing types

+ + + + + + + + + + +<% @types.each do |type| %> + + + + + + + +<% end %> +
NameDescription
<%= type.name %><%= type.description %><%= 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 %> + +
+Última actualización: <%= @type.updated_at %> +
diff --git a/app/views/types/show.html.erb b/app/views/types/show.html.erb index 98b32e7..78022a8 100644 --- a/app/views/types/show.html.erb +++ b/app/views/types/show.html.erb @@ -10,6 +10,11 @@ <%= @type.description %>

+

+ Actualizado en: + <%= @type.updated_at %> +

+ <%= link_to 'Edit', edit_type_path(@type) %> | <%= link_to 'Back', types_path %> diff --git a/app/views/types/show.html.erb~ b/app/views/types/show.html.erb~ new file mode 100644 index 0000000..0b7e9b7 --- /dev/null +++ b/app/views/types/show.html.erb~ @@ -0,0 +1,20 @@ +

<%= notice %>

+ +

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

+ +

+ Description: + <%= @type.description %> +

+ +

+ Actualizado en: + <%= @type.update_at %> +

+ + +<%= link_to 'Edit', edit_type_path(@type) %> | +<%= link_to 'Back', types_path %> From 436c60e4758e4e25a52b2cbf3be1dba09e76f32b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Sun, 25 Mar 2012 13:46:09 +0200 Subject: [PATCH 04/56] vista index y show de types --- app/views/types/index.html.erb | 4 +++- app/views/types/index.html.erb~ | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/views/types/index.html.erb b/app/views/types/index.html.erb index acec33b..52d9eaa 100644 --- a/app/views/types/index.html.erb +++ b/app/views/types/index.html.erb @@ -4,6 +4,7 @@ Name Description + Última actualización @@ -13,6 +14,7 @@ <%= type.name %> <%= type.description %> + <%= type.updated_at %> <%= link_to 'Show', type %> <%= link_to 'Edit', edit_type_path(type) %> <%= link_to 'Destroy', type, confirm: 'Are you sure?', method: :delete %> @@ -25,5 +27,5 @@ <%= link_to 'New Type', new_type_path %>
- +Última actualización:
diff --git a/app/views/types/index.html.erb~ b/app/views/types/index.html.erb~ index 72c949a..52d9eaa 100644 --- a/app/views/types/index.html.erb~ +++ b/app/views/types/index.html.erb~ @@ -4,6 +4,7 @@ Name Description + Última actualización @@ -13,6 +14,7 @@ <%= type.name %> <%= type.description %> + <%= type.updated_at %> <%= link_to 'Show', type %> <%= link_to 'Edit', edit_type_path(type) %> <%= link_to 'Destroy', type, confirm: 'Are you sure?', method: :delete %> @@ -25,5 +27,5 @@ <%= link_to 'New Type', new_type_path %>
-Última actualización: <%= @type.updated_at %> +Última actualización:
From 2a6aeb0c441fa39c33e29eacdf72c5c99337743b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Tue, 27 Mar 2012 10:03:48 +0200 Subject: [PATCH 05/56] =?UTF-8?q?Actualizaci=C3=B3n=20db,=20actualizaci?= =?UTF-8?q?=C3=B3n=20vistas=20index=20y=20show=20de=20types,=20acci=C3=B3n?= =?UTF-8?q?=20ordered=5Findex,=20hiperenlaces=20a=20tipos=20y=20tipos=20or?= =?UTF-8?q?denados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/types_controller.rb | 14 ++++ app/controllers/types_controller.rb~ | 97 +++++++++++++++++++++++++ app/views/layouts/application.html.erb | 6 ++ app/views/layouts/application.html.erb~ | 29 ++++++++ app/views/types/index.html.erb | 2 - app/views/types/ordered_index.html.erb | 29 ++++++++ app/views/types/ordered_index.html.erb~ | 0 config/routes.rb | 6 +- config/routes.rb~ | 8 +- 9 files changed, 186 insertions(+), 5 deletions(-) create mode 100644 app/controllers/types_controller.rb~ create mode 100644 app/views/layouts/application.html.erb~ create mode 100644 app/views/types/ordered_index.html.erb 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..8062c71 100644 --- a/app/controllers/types_controller.rb +++ b/app/controllers/types_controller.rb @@ -80,4 +80,18 @@ def destroy format.json { head :no_content } end end + + def ordered_index + 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 # ordered_index.html.erb + format.json { render json: @types } + end + end end diff --git a/app/controllers/types_controller.rb~ b/app/controllers/types_controller.rb~ new file mode 100644 index 0000000..8062c71 --- /dev/null +++ b/app/controllers/types_controller.rb~ @@ -0,0 +1,97 @@ +class TypesController < ApplicationController + # GET /types + # GET /types.json + def index + @types = Type.all + + 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 + @type = Type.find(params[:id]) + + respond_to do |format| + format.html # show.html.erb + format.json { render json: @type } + end + end + + # GET /types/new + # GET /types/new.json + def new + @type = Type.new + + respond_to do |format| + format.html # new.html.erb + format.json { render json: @type } + end + end + + # GET /types/1/edit + def edit + @type = Type.find(params[:id]) + end + + # POST /types + # POST /types.json + 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 + + # PUT /types/1 + # PUT /types/1.json + 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 + + # DELETE /types/1 + # DELETE /types/1.json + 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 + + def ordered_index + 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 # ordered_index.html.erb + format.json { render json: @types } + end + end +end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 0ca6011..3d7c49a 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -12,12 +12,18 @@ <%= link_to('Contact', planet_contact_path) %> <%= link_to('Ejemplo', planet_ejemplo_path) %> <%= link_to('Author', planet_author_path) %> +<%= link_to('Lista de tipos', types_path) %> +<%= link_to('Lista de tipos ordenados', ordered_index_types_path) %> <%= yield %> + <%= link_to('Index', planet_index_path) %> <%= link_to('Contact', planet_contact_path) %> <%= link_to('Ejemplo', planet_ejemplo_path) %> <%= link_to('Author', planet_author_path) %> +<%= link_to('Lista de tipos', types_path) %> +<%= link_to('Lista de tipos ordenados', ordered_index_types_path) %> + diff --git a/app/views/layouts/application.html.erb~ b/app/views/layouts/application.html.erb~ new file mode 100644 index 0000000..3d7c49a --- /dev/null +++ b/app/views/layouts/application.html.erb~ @@ -0,0 +1,29 @@ + + + + Planet + <%= stylesheet_link_tag "application", :media => "all" %> + <%= javascript_include_tag "application" %> + <%= csrf_meta_tags %> + + + +<%= link_to('Index', planet_index_path) %> +<%= link_to('Contact', planet_contact_path) %> +<%= link_to('Ejemplo', planet_ejemplo_path) %> +<%= link_to('Author', planet_author_path) %> +<%= link_to('Lista de tipos', types_path) %> +<%= link_to('Lista de tipos ordenados', ordered_index_types_path) %> + +<%= yield %> + + +<%= link_to('Index', planet_index_path) %> +<%= link_to('Contact', planet_contact_path) %> +<%= link_to('Ejemplo', planet_ejemplo_path) %> +<%= link_to('Author', planet_author_path) %> +<%= link_to('Lista de tipos', types_path) %> +<%= link_to('Lista de tipos ordenados', ordered_index_types_path) %> + + + diff --git a/app/views/types/index.html.erb b/app/views/types/index.html.erb index 52d9eaa..25e055b 100644 --- a/app/views/types/index.html.erb +++ b/app/views/types/index.html.erb @@ -27,5 +27,3 @@ <%= link_to 'New Type', new_type_path %>
-Última actualización: -
diff --git a/app/views/types/ordered_index.html.erb b/app/views/types/ordered_index.html.erb new file mode 100644 index 0000000..25e055b --- /dev/null +++ b/app/views/types/ordered_index.html.erb @@ -0,0 +1,29 @@ +

Listing types

+ + + + + + + + + + + +<% @types.each do |type| %> + + + + + + + + +<% end %> +
NameDescriptionÚltima actualización
<%= type.name %><%= type.description %><%= 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 %> + +
diff --git a/app/views/types/ordered_index.html.erb~ b/app/views/types/ordered_index.html.erb~ new file mode 100644 index 0000000..e69de29 diff --git a/config/routes.rb b/config/routes.rb index 9e0930a..ad7f51f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,8 @@ Planet::Application.routes.draw do - resources :types + + resources :types do + get 'ordered_index', :on => :collection + end get "planet/index" @@ -61,6 +64,7 @@ # root :to => 'welcome#index' root :to => "planet#index" + # See how all your routes lay out with "rake routes" diff --git a/config/routes.rb~ b/config/routes.rb~ index 64b2703..b865d63 100644 --- a/config/routes.rb~ +++ b/config/routes.rb~ @@ -1,5 +1,8 @@ Planet::Application.routes.draw do - resources :types + + resources :types do + get 'index', :on => :collection + end get "planet/index" @@ -7,7 +10,7 @@ Planet::Application.routes.draw do get "planet/ejemplo" -get "planet/author" + get "planet/author" # The priority is based upon order of creation: # first created -> highest priority. @@ -61,6 +64,7 @@ get "planet/author" # root :to => 'welcome#index' root :to => "planet#index" + # See how all your routes lay out with "rake routes" From 6e7b44ebf335927adbcf744e037c353748641a9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Thu, 29 Mar 2012 15:21:20 +0200 Subject: [PATCH 06/56] Actualizar --- app/views/layouts/application.html.erb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 3d7c49a..083673f 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -12,8 +12,8 @@ <%= link_to('Contact', planet_contact_path) %> <%= link_to('Ejemplo', planet_ejemplo_path) %> <%= link_to('Author', planet_author_path) %> -<%= link_to('Lista de tipos', types_path) %> -<%= link_to('Lista de tipos ordenados', ordered_index_types_path) %> +<%= link_to('Tipos', types_path) %> +<%= link_to('Tipos_ordenados', ordered_index_types_path) %> <%= yield %> @@ -22,8 +22,8 @@ <%= link_to('Contact', planet_contact_path) %> <%= link_to('Ejemplo', planet_ejemplo_path) %> <%= link_to('Author', planet_author_path) %> -<%= link_to('Lista de tipos', types_path) %> -<%= link_to('Lista de tipos ordenados', ordered_index_types_path) %> +<%= link_to('Tipos', types_path) %> +<%= link_to('Tipos_ordenados', ordered_index_types_path) %> From c0cd46aa25c45638c10bc1f29ec3587140cf9914 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Tue, 10 Apr 2012 16:40:13 +0200 Subject: [PATCH 07/56] =?UTF-8?q?cambios=20modelo=20y=20migraci=C3=B3n=20s?= =?UTF-8?q?ite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/javascripts/sites.js.coffee | 3 + app/assets/stylesheets/sites.css.scss | 3 + app/controllers/sites_controller.rb | 83 ++++++++++++++++++++++ app/helpers/sites_helper.rb | 2 + app/models/site.rb | 3 + app/models/site.rb~ | 2 + app/models/type.rb | 1 + app/models/type.rb~ | 2 + app/views/sites/_form.html.erb | 17 +++++ app/views/sites/edit.html.erb | 6 ++ app/views/sites/index.html.erb | 21 ++++++ app/views/sites/new.html.erb | 5 ++ app/views/sites/show.html.erb | 5 ++ config/routes.rb | 2 + db/migrate/20120410143500_create_sites.rb | 12 ++++ db/migrate/20120410143500_create_sites.rb~ | 8 +++ db/schema.rb | 11 ++- test/fixtures/sites.yml | 11 +++ test/functional/sites_controller_test.rb | 49 +++++++++++++ test/unit/helpers/sites_helper_test.rb | 4 ++ test/unit/site_test.rb | 7 ++ 21 files changed, 256 insertions(+), 1 deletion(-) create mode 100644 app/assets/javascripts/sites.js.coffee create mode 100644 app/assets/stylesheets/sites.css.scss create mode 100644 app/controllers/sites_controller.rb create mode 100644 app/helpers/sites_helper.rb create mode 100644 app/models/site.rb create mode 100644 app/models/site.rb~ create mode 100644 app/models/type.rb~ create mode 100644 app/views/sites/_form.html.erb create mode 100644 app/views/sites/edit.html.erb create mode 100644 app/views/sites/index.html.erb create mode 100644 app/views/sites/new.html.erb create mode 100644 app/views/sites/show.html.erb create mode 100644 db/migrate/20120410143500_create_sites.rb create mode 100644 db/migrate/20120410143500_create_sites.rb~ create mode 100644 test/fixtures/sites.yml create mode 100644 test/functional/sites_controller_test.rb create mode 100644 test/unit/helpers/sites_helper_test.rb create mode 100644 test/unit/site_test.rb diff --git a/app/assets/javascripts/sites.js.coffee b/app/assets/javascripts/sites.js.coffee new file mode 100644 index 0000000..7615679 --- /dev/null +++ b/app/assets/javascripts/sites.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/sites.css.scss b/app/assets/stylesheets/sites.css.scss new file mode 100644 index 0000000..682e55c --- /dev/null +++ b/app/assets/stylesheets/sites.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the sites 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/sites_controller.rb b/app/controllers/sites_controller.rb new file mode 100644 index 0000000..43f5290 --- /dev/null +++ b/app/controllers/sites_controller.rb @@ -0,0 +1,83 @@ +class SitesController < ApplicationController + # GET /sites + # GET /sites.json + def index + @sites = Site.all + + respond_to do |format| + format.html # index.html.erb + format.json { render json: @sites } + end + end + + # GET /sites/1 + # GET /sites/1.json + def show + @site = Site.find(params[:id]) + + respond_to do |format| + format.html # show.html.erb + format.json { render json: @site } + end + end + + # GET /sites/new + # GET /sites/new.json + def new + @site = Site.new + + respond_to do |format| + format.html # new.html.erb + format.json { render json: @site } + end + end + + # GET /sites/1/edit + def edit + @site = Site.find(params[:id]) + end + + # POST /sites + # POST /sites.json + def create + @site = Site.new(params[:site]) + + 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 + + # PUT /sites/1 + # PUT /sites/1.json + def update + @site = Site.find(params[:id]) + + 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 + + # DELETE /sites/1 + # DELETE /sites/1.json + def destroy + @site = Site.find(params[:id]) + @site.destroy + + respond_to do |format| + format.html { redirect_to sites_url } + format.json { head :no_content } + end + end +end diff --git a/app/helpers/sites_helper.rb b/app/helpers/sites_helper.rb new file mode 100644 index 0000000..621069d --- /dev/null +++ b/app/helpers/sites_helper.rb @@ -0,0 +1,2 @@ +module SitesHelper +end diff --git a/app/models/site.rb b/app/models/site.rb new file mode 100644 index 0000000..bf75ebd --- /dev/null +++ b/app/models/site.rb @@ -0,0 +1,3 @@ +class Site < ActiveRecord::Base + belongs_to :type +end diff --git a/app/models/site.rb~ b/app/models/site.rb~ new file mode 100644 index 0000000..3c824bd --- /dev/null +++ b/app/models/site.rb~ @@ -0,0 +1,2 @@ +class Site < ActiveRecord::Base +end diff --git a/app/models/type.rb b/app/models/type.rb index e89da76..52f15c5 100644 --- a/app/models/type.rb +++ b/app/models/type.rb @@ -1,2 +1,3 @@ class Type < ActiveRecord::Base + has_many :sites end diff --git a/app/models/type.rb~ b/app/models/type.rb~ new file mode 100644 index 0000000..e89da76 --- /dev/null +++ b/app/models/type.rb~ @@ -0,0 +1,2 @@ +class Type < ActiveRecord::Base +end diff --git a/app/views/sites/_form.html.erb b/app/views/sites/_form.html.erb new file mode 100644 index 0000000..b057ff0 --- /dev/null +++ b/app/views/sites/_form.html.erb @@ -0,0 +1,17 @@ +<%= form_for(@site) do |f| %> + <% if @site.errors.any? %> +
+

<%= pluralize(@site.errors.count, "error") %> prohibited this site from being saved:

+ +
    + <% @site.errors.full_messages.each do |msg| %> +
  • <%= msg %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= f.submit %> +
+<% end %> diff --git a/app/views/sites/edit.html.erb b/app/views/sites/edit.html.erb new file mode 100644 index 0000000..d46384f --- /dev/null +++ b/app/views/sites/edit.html.erb @@ -0,0 +1,6 @@ +

Editing site

+ +<%= render 'form' %> + +<%= link_to 'Show', @site %> | +<%= link_to 'Back', sites_path %> diff --git a/app/views/sites/index.html.erb b/app/views/sites/index.html.erb new file mode 100644 index 0000000..2f70661 --- /dev/null +++ b/app/views/sites/index.html.erb @@ -0,0 +1,21 @@ +

Listing sites

+ + + + + + + + +<% @sites.each do |site| %> + + + + + +<% end %> +
<%= link_to 'Show', site %><%= link_to 'Edit', edit_site_path(site) %><%= link_to 'Destroy', site, confirm: 'Are you sure?', method: :delete %>
+ +
+ +<%= link_to 'New Site', new_site_path %> diff --git a/app/views/sites/new.html.erb b/app/views/sites/new.html.erb new file mode 100644 index 0000000..2988bdc --- /dev/null +++ b/app/views/sites/new.html.erb @@ -0,0 +1,5 @@ +

New site

+ +<%= render 'form' %> + +<%= link_to 'Back', sites_path %> diff --git a/app/views/sites/show.html.erb b/app/views/sites/show.html.erb new file mode 100644 index 0000000..bf3f9a7 --- /dev/null +++ b/app/views/sites/show.html.erb @@ -0,0 +1,5 @@ +

<%= notice %>

+ + +<%= link_to 'Edit', edit_site_path(@site) %> | +<%= link_to 'Back', sites_path %> diff --git a/config/routes.rb b/config/routes.rb index ad7f51f..f476920 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,7 @@ Planet::Application.routes.draw do + resources :sites + resources :types do get 'ordered_index', :on => :collection end diff --git a/db/migrate/20120410143500_create_sites.rb b/db/migrate/20120410143500_create_sites.rb new file mode 100644 index 0000000..3938817 --- /dev/null +++ b/db/migrate/20120410143500_create_sites.rb @@ -0,0 +1,12 @@ +class CreateSites < ActiveRecord::Migration + def change + create_table :sites do |t| + + t.string :name + t.text :description + t.integer :type_id + t.string :image_url + t.timestamps + end + end +end diff --git a/db/migrate/20120410143500_create_sites.rb~ b/db/migrate/20120410143500_create_sites.rb~ new file mode 100644 index 0000000..3de0f84 --- /dev/null +++ b/db/migrate/20120410143500_create_sites.rb~ @@ -0,0 +1,8 @@ +class CreateSites < ActiveRecord::Migration + def change + create_table :sites do |t| + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 8084ffc..15f1f9a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,16 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20120317231537) do +ActiveRecord::Schema.define(:version => 20120410143500) do + + create_table "sites", :force => true do |t| + t.string "name" + t.text "description" + t.integer "type_id" + t.string "image_url" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end create_table "types", :force => true do |t| t.string "name" diff --git a/test/fixtures/sites.yml b/test/fixtures/sites.yml new file mode 100644 index 0000000..c63aac0 --- /dev/null +++ b/test/fixtures/sites.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/functional/sites_controller_test.rb b/test/functional/sites_controller_test.rb new file mode 100644 index 0000000..beac6d1 --- /dev/null +++ b/test/functional/sites_controller_test.rb @@ -0,0 +1,49 @@ +require 'test_helper' + +class SitesControllerTest < ActionController::TestCase + setup do + @site = sites(:one) + end + + test "should get index" do + get :index + assert_response :success + assert_not_nil assigns(:sites) + end + + test "should get new" do + get :new + assert_response :success + end + + test "should create site" do + assert_difference('Site.count') do + post :create, site: @site.attributes + end + + assert_redirected_to site_path(assigns(:site)) + end + + test "should show site" do + get :show, id: @site + assert_response :success + end + + test "should get edit" do + get :edit, id: @site + assert_response :success + end + + test "should update site" do + put :update, id: @site, site: @site.attributes + assert_redirected_to site_path(assigns(:site)) + end + + test "should destroy site" do + assert_difference('Site.count', -1) do + delete :destroy, id: @site + end + + assert_redirected_to sites_path + end +end diff --git a/test/unit/helpers/sites_helper_test.rb b/test/unit/helpers/sites_helper_test.rb new file mode 100644 index 0000000..0e92edf --- /dev/null +++ b/test/unit/helpers/sites_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class SitesHelperTest < ActionView::TestCase +end diff --git a/test/unit/site_test.rb b/test/unit/site_test.rb new file mode 100644 index 0000000..38c8dd0 --- /dev/null +++ b/test/unit/site_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class SiteTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end From f3a73438987ede4798ef4fd4eb433a4461aa630d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Tue, 10 Apr 2012 16:54:19 +0200 Subject: [PATCH 08/56] =?UTF-8?q?Adaptaci=C3=B3n=20de=20vistas=20al=20mode?= =?UTF-8?q?lo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/sites/_form.html.erb | 16 ++++++++++++++++ app/views/sites/_form.html.erb~ | 33 +++++++++++++++++++++++++++++++++ app/views/sites/index.html.erb | 8 ++++++++ app/views/sites/index.html.erb~ | 21 +++++++++++++++++++++ app/views/sites/show.html.erb | 19 +++++++++++++++++++ app/views/sites/show.html.erb~ | 24 ++++++++++++++++++++++++ 6 files changed, 121 insertions(+) create mode 100644 app/views/sites/_form.html.erb~ create mode 100644 app/views/sites/index.html.erb~ create mode 100644 app/views/sites/show.html.erb~ diff --git a/app/views/sites/_form.html.erb b/app/views/sites/_form.html.erb index b057ff0..abc9fec 100644 --- a/app/views/sites/_form.html.erb +++ b/app/views/sites/_form.html.erb @@ -11,6 +11,22 @@ <% end %> +
+ <%= f.label :name %>
+ <%= f.text_field :name %> +
+
+ <%= f.label :description %>
+ <%= f.text_area :description , :rows => 4 %> +
+
+ <%= f.label :type_id %>
+ <%= f.collection_select(:type_id, Type.find(:all, :order => :name), :id, :name) %> +
+
+ <%= f.label :image_url %>
+ <%= f.text_field :image_url %> +
<%= f.submit %>
diff --git a/app/views/sites/_form.html.erb~ b/app/views/sites/_form.html.erb~ new file mode 100644 index 0000000..abc9fec --- /dev/null +++ b/app/views/sites/_form.html.erb~ @@ -0,0 +1,33 @@ +<%= form_for(@site) do |f| %> + <% if @site.errors.any? %> +
+

<%= pluralize(@site.errors.count, "error") %> prohibited this site from being saved:

+ +
    + <% @site.errors.full_messages.each do |msg| %> +
  • <%= msg %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= f.label :name %>
+ <%= f.text_field :name %> +
+
+ <%= f.label :description %>
+ <%= f.text_area :description , :rows => 4 %> +
+
+ <%= f.label :type_id %>
+ <%= f.collection_select(:type_id, Type.find(:all, :order => :name), :id, :name) %> +
+
+ <%= f.label :image_url %>
+ <%= f.text_field :image_url %> +
+
+ <%= f.submit %> +
+<% end %> diff --git a/app/views/sites/index.html.erb b/app/views/sites/index.html.erb index 2f70661..727cd88 100644 --- a/app/views/sites/index.html.erb +++ b/app/views/sites/index.html.erb @@ -2,6 +2,10 @@ + + + + @@ -9,6 +13,10 @@ <% @sites.each do |site| %> + + + + diff --git a/app/views/sites/index.html.erb~ b/app/views/sites/index.html.erb~ new file mode 100644 index 0000000..2f70661 --- /dev/null +++ b/app/views/sites/index.html.erb~ @@ -0,0 +1,21 @@ +

Listing sites

+ +
NameDescriptionTypeImage url
<%=site.name%><%=site.description%><%=site.type.name if site.type %><%=site.image_url %> <%= link_to 'Show', site %> <%= link_to 'Edit', edit_site_path(site) %> <%= link_to 'Destroy', site, confirm: 'Are you sure?', method: :delete %>
+ + + + + + +<% @sites.each do |site| %> + + + + + +<% end %> +
<%= link_to 'Show', site %><%= link_to 'Edit', edit_site_path(site) %><%= link_to 'Destroy', site, confirm: 'Are you sure?', method: :delete %>
+ +
+ +<%= link_to 'New Site', new_site_path %> diff --git a/app/views/sites/show.html.erb b/app/views/sites/show.html.erb index bf3f9a7..a183a89 100644 --- a/app/views/sites/show.html.erb +++ b/app/views/sites/show.html.erb @@ -1,5 +1,24 @@

<%= notice %>

+

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

+ +

+ Description: + <%= @site.description %> +

+ +

+ Type: + <%= @site.type.name if @site.type %> +

+ +

+ Image url: + <%= @site.image_url %> +

<%= link_to 'Edit', edit_site_path(@site) %> | <%= link_to 'Back', sites_path %> diff --git a/app/views/sites/show.html.erb~ b/app/views/sites/show.html.erb~ new file mode 100644 index 0000000..a183a89 --- /dev/null +++ b/app/views/sites/show.html.erb~ @@ -0,0 +1,24 @@ +

<%= notice %>

+ +

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

+ +

+ Description: + <%= @site.description %> +

+ +

+ Type: + <%= @site.type.name if @site.type %> +

+ +

+ Image url: + <%= @site.image_url %> +

+ +<%= link_to 'Edit', edit_site_path(@site) %> | +<%= link_to 'Back', sites_path %> From 6809f4384b34b06cab0ad8f083114f5bb403d282 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Tue, 10 Apr 2012 17:04:03 +0200 Subject: [PATCH 09/56] =?UTF-8?q?Adaptaci=C3=B3n=20de=20vistas=20al=20mode?= =?UTF-8?q?lo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/seeds.rb | 44 ++++++++++++++++++++++++++++++++++--- db/seeds.rb~ | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 db/seeds.rb~ diff --git a/db/seeds.rb b/db/seeds.rb index ca6a311..e26bf5f 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -6,15 +6,53 @@ # cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) # Mayor.create(name: 'Emanuel', city: cities.first) -Type.create( +Type.delete_all + +tm = Type.create( name: 'Monumento', description: 'Edificio de interes turistico o artistico') -Type.create( +tn = Type.create( name: 'Naturaleza', description: 'Lugar al aire libre de interes natural o de recreo') -Type.create( +tr = Type.create( name: 'Ruina', description: 'Lugar o resto de interes arquelogico') + +Site.delete_all + + +Site.create( + name: 'Pedriza', + description: 'Magnifico valle al norte de Madrid en el Macizo Central', + type_id: tn.id, + image_url: 'pedriza.png') + +Site.create( + name: 'Catedral de Florencia', + description: 'Catedral de la ciudad de Florencia con la que se inicia el Renacimiento', + type_id: tm.id, + image_url: 'florencia.png') + +Site.create( + name: 'Jardin de Lineo', + description: 'Jardin de la ciudad sueca de Uppsala donde el famoso naturalista enia su coleccion de plantas', + type_id: tn.id, + image_url: 'arbol1.png') + +Site.create( + name: 'Reichstag', + description: 'Parlamento aleman en la ciudad de Berlin', + type_id: tm.id, + image_url: 'reichstag.png') + +Site.create( + name: 'Pergamo', + description: 'Puerta del mercado de la antigua ciudad griega de Pergamo del museo arquelogico de Berlin', + type_id: tr.id, + image_url: 'pergamo.png') + + + diff --git a/db/seeds.rb~ b/db/seeds.rb~ new file mode 100644 index 0000000..b9eb1b5 --- /dev/null +++ b/db/seeds.rb~ @@ -0,0 +1,61 @@ +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). +# +# Examples: +# +# cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) +# Mayor.create(name: 'Emanuel', city: cities.first) + +Type.delete_all + +tm = Type.create( + name: 'Monumento', + description: 'Edificio de interes turistico o artistico') + +tn = Type.create( + name: 'Naturaleza', + description: 'Lugar al aire libre de interes natural o de recreo') + +tr = Type.create( + name: 'Ruina', + description: 'Lugar o resto de interes arquelogico') + + +Site.delete_all + + +Site.create( + name: 'Pedriza', + description: 'Magnifico valle al norte de Madrid en el Macizo Central', + type_id: tn.id, + image_url: 'pedriza.png') + +Site.create( + name: 'Catedral de Florencia', + description: 'Catedral de la ciudad de Florencia con la que se inicia el Renacimiento', + type_id: tm.id, + image_url: 'florencia.png') + +Site.create( + name: 'Jardin de Lineo', + description: 'Jardin de la ciudad sueca de Uppsala donde el famoso naturalista enia su coleccion de plantas', + type_id: tn.id, + image_url: 'arbol1.png') + +Site.create( + name: 'Reichstag', + description: 'Parlamento aleman en la ciudad de Berlin', + type_id: tm.id, + image_url: 'reichstag.png') + +Site.create( + name: 'Pergamo', + description: 'Puerta del mercado de la antigua ciudad griega de Pergamo del museo arquelogico de Berlin', + type_id: tr.id, + image_url: 'pergamo.png') + +# user_id esta protegido con "attr_protected" y debe inicializarse asi, +# Site.create(....) levantaria una excepcipón al intentar inicializarlo +Site.all.each { |obj| obj.user_id = 1 ; obj.save } + + From 57daa8f82a7a544d2a2ddda8ac5a3bfd23bea59f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Tue, 10 Apr 2012 17:25:33 +0200 Subject: [PATCH 10/56] Rutas anidadas types/:id/sites --- app/controllers/sites_controller.rb | 9 ++- app/controllers/sites_controller.rb~ | 86 +++++++++++++++++++++++++ app/views/types/index.html.erb | 2 +- app/views/types/index.html.erb~ | 2 - app/views/types/ordered_index.html.erb | 2 +- app/views/types/ordered_index.html.erb~ | 29 +++++++++ config/routes.rb | 17 +++-- config/routes.rb~ | 4 +- 8 files changed, 136 insertions(+), 15 deletions(-) create mode 100644 app/controllers/sites_controller.rb~ diff --git a/app/controllers/sites_controller.rb b/app/controllers/sites_controller.rb index 43f5290..b8c55f3 100644 --- a/app/controllers/sites_controller.rb +++ b/app/controllers/sites_controller.rb @@ -1,9 +1,12 @@ class SitesController < ApplicationController # GET /sites # GET /sites.json - def index - @sites = Site.all - + 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 } diff --git a/app/controllers/sites_controller.rb~ b/app/controllers/sites_controller.rb~ new file mode 100644 index 0000000..9e4d602 --- /dev/null +++ b/app/controllers/sites_controller.rb~ @@ -0,0 +1,86 @@ +class SitesController < ApplicationController + # GET /sites + # GET /sites.json + 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 + + # GET /sites/1 + # GET /sites/1.json + def show + @site = Site.find(params[:id]) + + respond_to do |format| + format.html # show.html.erb + format.json { render json: @site } + end + end + + # GET /sites/new + # GET /sites/new.json + 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 + + # GET /sites/1/edit + def edit + @site = current_user.sites.find(params[:id]) # busca solo en sitios asociados a current_user + end + + # POST /sites + # POST /sites.json + 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 + + # PUT /sites/1 + # PUT /sites/1.json + 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 + + # DELETE /sites/1 + # DELETE /sites/1.json + 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 +end diff --git a/app/views/types/index.html.erb b/app/views/types/index.html.erb index 25e055b..597f012 100644 --- a/app/views/types/index.html.erb +++ b/app/views/types/index.html.erb @@ -12,7 +12,7 @@ <% @types.each do |type| %> - <%= type.name %> + <%= link_to type.name, type_sites_path(type) %> <%= type.description %> <%= type.updated_at %> <%= link_to 'Show', type %> diff --git a/app/views/types/index.html.erb~ b/app/views/types/index.html.erb~ index 52d9eaa..25e055b 100644 --- a/app/views/types/index.html.erb~ +++ b/app/views/types/index.html.erb~ @@ -27,5 +27,3 @@ <%= link_to 'New Type', new_type_path %>
-Última actualización: -
diff --git a/app/views/types/ordered_index.html.erb b/app/views/types/ordered_index.html.erb index 25e055b..3741544 100644 --- a/app/views/types/ordered_index.html.erb +++ b/app/views/types/ordered_index.html.erb @@ -12,7 +12,7 @@ <% @types.each do |type| %> - <%= type.name %> + <%= link_to type.name,type_sites_path(type.id) %> <%= type.description %> <%= type.updated_at %> <%= link_to 'Show', type %> diff --git a/app/views/types/ordered_index.html.erb~ b/app/views/types/ordered_index.html.erb~ index e69de29..25e055b 100644 --- a/app/views/types/ordered_index.html.erb~ +++ b/app/views/types/ordered_index.html.erb~ @@ -0,0 +1,29 @@ +

Listing types

+ + + + + + + + + + + +<% @types.each do |type| %> + + + + + + + + +<% end %> +
NameDescriptionÚltima actualización
<%= type.name %><%= type.description %><%= 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 %> + +
diff --git a/config/routes.rb b/config/routes.rb index f476920..223ba5c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,17 +2,20 @@ resources :sites - resources :types do - get 'ordered_index', :on => :collection - end + resources :types do # Rutas anidadas /types/id/sites..., + resources :sites, :only => [ :index ] # Restringe a acción “index” + + get 'ordered_index', :on => :collection + end + + get "planet/index" - get "planet/index" + get "planet/contact" - get "planet/contact" + get "planet/ejemplo" - get "planet/ejemplo" + get "planet/author" - get "planet/author" # The priority is based upon order of creation: # first created -> highest priority. diff --git a/config/routes.rb~ b/config/routes.rb~ index b865d63..f476920 100644 --- a/config/routes.rb~ +++ b/config/routes.rb~ @@ -1,7 +1,9 @@ Planet::Application.routes.draw do + resources :sites + resources :types do - get 'index', :on => :collection + get 'ordered_index', :on => :collection end get "planet/index" From 472912f491ffa1c239a0de5adb9aa2417517c828 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Tue, 10 Apr 2012 18:00:23 +0200 Subject: [PATCH 11/56] Cambio de look con nuevas vistas y CSS --- app/assets/images/arbol1.png | Bin 0 -> 41721 bytes app/assets/images/florencia.png | Bin 0 -> 34337 bytes app/assets/images/logo3.png | Bin 0 -> 10335 bytes app/assets/images/pedriza.png | Bin 0 -> 30190 bytes app/assets/images/pergamo.png | Bin 0 -> 33215 bytes app/assets/images/reichstag.png | Bin 0 -> 35028 bytes app/assets/javascripts/trips.js.coffee | 3 + app/assets/javascripts/visits.js.coffee | 3 + app/assets/stylesheets/planet.css | 157 ++++++++++++++++++++++++ app/assets/stylesheets/trips.css.scss | 3 + app/assets/stylesheets/visits.css.scss | 3 + app/views/layouts/application.html.erb | 46 +++---- app/views/layouts/application.html.erb~ | 46 +++---- app/views/sites/index.html.erb | 53 ++++---- app/views/sites/index.html.erb~ | 8 ++ app/views/sites/show.html.erb | 29 ++--- app/views/sites/show.html.erb~ | 29 ++--- app/views/types/index.html.erb | 2 + app/views/types/index.html.erb~ | 2 +- 19 files changed, 275 insertions(+), 109 deletions(-) create mode 100644 app/assets/images/arbol1.png create mode 100644 app/assets/images/florencia.png create mode 100644 app/assets/images/logo3.png create mode 100644 app/assets/images/pedriza.png create mode 100644 app/assets/images/pergamo.png create mode 100644 app/assets/images/reichstag.png create mode 100644 app/assets/javascripts/trips.js.coffee create mode 100644 app/assets/javascripts/visits.js.coffee create mode 100644 app/assets/stylesheets/planet.css create mode 100644 app/assets/stylesheets/trips.css.scss create mode 100644 app/assets/stylesheets/visits.css.scss diff --git a/app/assets/images/arbol1.png b/app/assets/images/arbol1.png new file mode 100644 index 0000000000000000000000000000000000000000..6affc09b02b9b37e83cb3f294dcf13ae01b832fe GIT binary patch literal 41721 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/florencia.png b/app/assets/images/florencia.png new file mode 100644 index 0000000000000000000000000000000000000000..6398a2e39b0b1ef0a285a1ab1d23ebc60d774796 GIT binary patch literal 34337 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/logo3.png b/app/assets/images/logo3.png new file mode 100644 index 0000000000000000000000000000000000000000..bfa4c138a06c6474bb7564f77fec65c9ccb83336 GIT binary patch literal 10335 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/pedriza.png b/app/assets/images/pedriza.png new file mode 100644 index 0000000000000000000000000000000000000000..8d300fb557b576e64dcaf441146f912185b0ae4d GIT binary patch literal 30190 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/pergamo.png b/app/assets/images/pergamo.png new file mode 100644 index 0000000000000000000000000000000000000000..7e462c2cf6e3db87b46bdabeff66f88210c4eabc GIT binary patch literal 33215 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

C!^C&T; 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 A?EnA( literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/trips.js.coffee b/app/assets/javascripts/trips.js.coffee new file mode 100644 index 0000000..7615679 --- /dev/null +++ b/app/assets/javascripts/trips.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/javascripts/visits.js.coffee b/app/assets/javascripts/visits.js.coffee new file mode 100644 index 0000000..7615679 --- /dev/null +++ b/app/assets/javascripts/visits.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/planet.css b/app/assets/stylesheets/planet.css new file mode 100644 index 0000000..28c4fcc --- /dev/null +++ b/app/assets/stylesheets/planet.css @@ -0,0 +1,157 @@ +/* Global styles (no utilizados de momento) */ + +#planet #notice { + color: #000; + border: 2px solid red; + padding: 1em; + margin-bottom: 2em; + background-color: #f0f0f0; + font: bold smaller sans-serif; +} + + +#planet h1 { + font: 150% sans-serif; + color: #226; + border-bottom: 3px dotted #77d; +} + +/* Styles for products/index */ + +#site_list table { + border-collapse: collapse; +} + +#site_list table tr td { + padding: 5px; + vertical-align: top; +} + +#site_list .list_image { + width: 60px; + height: 70px; +} + +#site_list .list_description { + width: 60%; +} + +#site_list .list_description dl { + margin: 0; +} + +#site_list .list_description dt { + color: #244; + font-weight: bold; + font-size: larger; +} + +#site_list .list_description dd { + margin: 0; +} + +#site_list .list_actions { + font-size: x-small; + text-align: right; + padding-left: 1em; +} + +#site_list .list_line_even { + background: #a8b8f8; +} + +#site_list .list_line_odd { + background: #88b0f8; +} + + +/* START:mainlayout */ +/* Styles for main page */ + +#banner { + background: #668; + padding-top: 10px; + padding-bottom: 10px; + border-bottom: 2px solid; + font: small-caps 40px/40px "Times New Roman", serif; + color: #bfb; + text-align: center; +} + +#banner img { + float: left; + padding-left: 10px; +} + +#columns { + background: #446; +} + +#main { + margin-left: 9em; /* Ajuste de borde izquierdo */ + padding-top: 4ex; + padding-left: 2em; + background: white; +} + +#side { + float: left; + padding-top: 1em; + padding-left: 1em; + padding-bottom: 1em; + width: 8em; /* Ajuste de borde izquierdo */ + background: #446; +} + +#side a { + color: #bfb; + font-size: small; +} +/* END:mainlayout */ + +/* An entry in the store catalog (no utilizados de momento) */ + +#planet .entry { + overflow: auto; + margin-top: 1em; + border-bottom: 1px dotted #77d; +} + +#planet .name { + font-size: 120%; + font-family: sans-serif; +} + +#store .entry img { + width: 80px; + margin-right: 5px; + margin-bottom: 5px; + float: left; +} + + +#store .entry h3 { + margin-top: 0; + margin-bottom: 2px; + color: #227; +} + +#store .entry p { + margin-top: 0.5em; + margin-bottom: 0.8em; +} + +#store .entry .price_line { + clear: both; + margin-bottom: 0.5em; +} + +#store .entry .add_to_cart { + position: relative; +} + +#store .entry .price { + color: #44a; + font-weight: bold; + margin-right: 2em; +} diff --git a/app/assets/stylesheets/trips.css.scss b/app/assets/stylesheets/trips.css.scss new file mode 100644 index 0000000..473cbc3 --- /dev/null +++ b/app/assets/stylesheets/trips.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the trips controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/visits.css.scss b/app/assets/stylesheets/visits.css.scss new file mode 100644 index 0000000..99b00b9 --- /dev/null +++ b/app/assets/stylesheets/visits.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the visits controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 083673f..aca6711 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,29 +1,31 @@ - Planet - <%= stylesheet_link_tag "application", :media => "all" %> - <%= javascript_include_tag "application" %> - <%= csrf_meta_tags %> +Planet Travel Site + +<%= stylesheet_link_tag "scaffold" %> +<%= stylesheet_link_tag "planet", :media => "all" %> + +<%= javascript_include_tag :defaults %> +<%= csrf_meta_tag %> - - -<%= link_to('Index', planet_index_path) %> -<%= link_to('Contact', planet_contact_path) %> -<%= link_to('Ejemplo', planet_ejemplo_path) %> -<%= link_to('Author', planet_author_path) %> -<%= link_to('Tipos', types_path) %> -<%= link_to('Tipos_ordenados', ordered_index_types_path) %> - + +

+
+
+<%= link_to "Home", planet_index_path %>
+<%= link_to "Tipos", types_path %>
+<%= link_to('Tipos ordenados', ordered_index_types_path) %>
+<%= link_to "Sitios", sites_path %>
+<%= link_to "Contact", planet_contact_path %> +
+
<%= yield %> - - -<%= link_to('Index', planet_index_path) %> -<%= link_to('Contact', planet_contact_path) %> -<%= link_to('Ejemplo', planet_ejemplo_path) %> -<%= link_to('Author', planet_author_path) %> -<%= link_to('Tipos', types_path) %> -<%= link_to('Tipos_ordenados', ordered_index_types_path) %> - +
+
+ diff --git a/app/views/layouts/application.html.erb~ b/app/views/layouts/application.html.erb~ index 3d7c49a..b84bb45 100644 --- a/app/views/layouts/application.html.erb~ +++ b/app/views/layouts/application.html.erb~ @@ -1,29 +1,31 @@ - Planet - <%= stylesheet_link_tag "application", :media => "all" %> - <%= javascript_include_tag "application" %> - <%= csrf_meta_tags %> +Planet Travel Site + +<%= stylesheet_link_tag "scaffold" %> +<%= stylesheet_link_tag "planet", :media => "all" %> + +<%= javascript_include_tag :defaults %> +<%= csrf_meta_tag %> - - -<%= link_to('Index', planet_index_path) %> -<%= link_to('Contact', planet_contact_path) %> -<%= link_to('Ejemplo', planet_ejemplo_path) %> -<%= link_to('Author', planet_author_path) %> -<%= link_to('Lista de tipos', types_path) %> -<%= link_to('Lista de tipos ordenados', ordered_index_types_path) %> - + + +
+
+<%= link_to "Home", planet_index_path %>
+<%= link_to "Tipos", types_path %>
+<%= link_to('Tipos_ordenados', ordered_index_types_path) %>
+<%= link_to "Sitios", sites_path %>
+<%= link_to "Contact", planet_contact_path %> +
+
<%= yield %> - - -<%= link_to('Index', planet_index_path) %> -<%= link_to('Contact', planet_contact_path) %> -<%= link_to('Ejemplo', planet_ejemplo_path) %> -<%= link_to('Author', planet_author_path) %> -<%= link_to('Lista de tipos', types_path) %> -<%= link_to('Lista de tipos ordenados', ordered_index_types_path) %> - +
+
+ diff --git a/app/views/sites/index.html.erb b/app/views/sites/index.html.erb index 727cd88..8fa0a51 100644 --- a/app/views/sites/index.html.erb +++ b/app/views/sites/index.html.erb @@ -1,29 +1,34 @@ -

Listing sites

+
+

Listing Sites

- - - - - - - - - - +
NameDescriptionTypeImage url
+ <% @sites.each do |site| %> + -<% @sites.each do |site| %> - - - - - - - - - + + + + + + + <% end %>
<%=site.name%><%=site.description%><%=site.type.name if site.type %><%=site.image_url %><%= link_to 'Show', site %><%= link_to 'Edit', edit_site_path(site) %><%= link_to 'Destroy', site, confirm: 'Are you sure?', method: :delete %>
+ <%= link_to image_tag(site.image_url, :class => 'list_image'), site %> + +
+
+ <%= link_to site.name, site %>
+
+ <%= truncate(strip_tags(site.description), :length => 80) %>
+
+
+<%= link_to 'Show', site %>
+<%= link_to 'Edit', edit_site_path(site) %>
+<%= link_to 'Destroy', site, +:confirm => 'Are you sure?', +:method => :delete %> +
+

+<%= link_to 'New site', new_site_path %> -
- -<%= link_to 'New Site', new_site_path %> diff --git a/app/views/sites/index.html.erb~ b/app/views/sites/index.html.erb~ index 2f70661..727cd88 100644 --- a/app/views/sites/index.html.erb~ +++ b/app/views/sites/index.html.erb~ @@ -2,6 +2,10 @@ + + + + @@ -9,6 +13,10 @@ <% @sites.each do |site| %> + + + + diff --git a/app/views/sites/show.html.erb b/app/views/sites/show.html.erb index a183a89..8f8369a 100644 --- a/app/views/sites/show.html.erb +++ b/app/views/sites/show.html.erb @@ -1,24 +1,13 @@

<%= notice %>

-

- Name: - <%= @site.name %> -

- -

- Description: - <%= @site.description %> -

- -

- Type: - <%= @site.type.name if @site.type %> -

- -

- Image url: - <%= @site.image_url %> -

- +
+

<%= @site.type.name if @site.type %>

+<%= image_tag(@site.image_url, :class => 'site_image') %> +

<%= @site.name %>

+ +

<%=sanitize @site.description %>

+

<%= link_to 'Edit', edit_site_path(@site) %> | <%= link_to 'Back', sites_path %> + diff --git a/app/views/sites/show.html.erb~ b/app/views/sites/show.html.erb~ index a183a89..c5f0134 100644 --- a/app/views/sites/show.html.erb~ +++ b/app/views/sites/show.html.erb~ @@ -1,24 +1,13 @@

<%= notice %>

-

- Name: - <%= @site.name %> -

- -

- Description: - <%= @site.description %> -

- -

- Type: - <%= @site.type.name if @site.type %> -

- -

- Image url: - <%= @site.image_url %> -

- +
+

<%= @site.type.name if @site.type %>

+<%= image_tag(@site.image_url, :class => 'site_image') %> +

<%= @site.name %>

+ +

<%=sanitize @site.description %>

+

<%= link_to 'Edit', edit_site_path(@site) %> | <%= link_to 'Back', sites_path %> + diff --git a/app/views/types/index.html.erb b/app/views/types/index.html.erb index 597f012..aa159be 100644 --- a/app/views/types/index.html.erb +++ b/app/views/types/index.html.erb @@ -27,3 +27,5 @@ <%= link_to 'New Type', new_type_path %>
+ + diff --git a/app/views/types/index.html.erb~ b/app/views/types/index.html.erb~ index 25e055b..597f012 100644 --- a/app/views/types/index.html.erb~ +++ b/app/views/types/index.html.erb~ @@ -12,7 +12,7 @@ <% @types.each do |type| %>

- + From 6e00f2fa11ebc7a0e1d8904b9d18e8ede89bed07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Tue, 10 Apr 2012 20:17:28 +0200 Subject: [PATCH 12/56] validaciones y tests corregidos --- app/models/site.rb | 6 +++ app/models/site.rb~ | 1 + app/models/type.rb | 3 ++ app/models/type.rb~ | 1 + test/fixtures/types.yml | 11 +++++ test/fixtures/types.yml~ | 9 ++++ test/functional/types_controller_test.rb | 8 +++- test/functional/types_controller_test.rb~ | 53 +++++++++++++++++++++++ test/unit/site_test.rb | 10 +++++ test/unit/site_test.rb~ | 7 +++ test/unit/type_test.rb | 8 ++++ test/unit/type_test.rb~ | 7 +++ 12 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/types.yml~ create mode 100644 test/functional/types_controller_test.rb~ create mode 100644 test/unit/site_test.rb~ create mode 100644 test/unit/type_test.rb~ diff --git a/app/models/site.rb b/app/models/site.rb index bf75ebd..06f4e11 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -1,3 +1,9 @@ class Site < ActiveRecord::Base belongs_to :type + + # Se añaden estas definiciones + validates :name, :type_id, :image_url, + :presence => true # campo obligatorio end + + diff --git a/app/models/site.rb~ b/app/models/site.rb~ index 3c824bd..bf75ebd 100644 --- a/app/models/site.rb~ +++ b/app/models/site.rb~ @@ -1,2 +1,3 @@ class Site < ActiveRecord::Base + belongs_to :type end diff --git a/app/models/type.rb b/app/models/type.rb index 52f15c5..7304bf9 100644 --- a/app/models/type.rb +++ b/app/models/type.rb @@ -1,3 +1,6 @@ class Type < ActiveRecord::Base has_many :sites + # Se añade esta definición de recurso + validates :name, :description, :presence => true # campo obligatorio + validates :name, :uniqueness => true # Campo no repetido end diff --git a/app/models/type.rb~ b/app/models/type.rb~ index e89da76..52f15c5 100644 --- a/app/models/type.rb~ +++ b/app/models/type.rb~ @@ -1,2 +1,3 @@ class Type < ActiveRecord::Base + has_many :sites end diff --git a/test/fixtures/types.yml b/test/fixtures/types.yml index 53b2c6a..412e1f7 100644 --- a/test/fixtures/types.yml +++ b/test/fixtures/types.yml @@ -7,3 +7,14 @@ one: two: name: MyString description: MyText + +# Podriamos añadir nuevos datos de inicialización, que se referencian como +# -> types(:monumento) types(:naturaleza) + +monumento: + name: Monumento + description: “Edificio o construcción de valor historico” + +naturaleza: + name: Naturaleza + description: “Lugar al aire libre de interés natural” diff --git a/test/fixtures/types.yml~ b/test/fixtures/types.yml~ new file mode 100644 index 0000000..53b2c6a --- /dev/null +++ b/test/fixtures/types.yml~ @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +one: + name: MyString + description: MyText + +two: + name: MyString + description: MyText diff --git a/test/functional/types_controller_test.rb b/test/functional/types_controller_test.rb index 2e1931b..803d655 100644 --- a/test/functional/types_controller_test.rb +++ b/test/functional/types_controller_test.rb @@ -3,6 +3,10 @@ class TypesControllerTest < ActionController::TestCase setup do @type = types(:one) + @update = { # @update: parametros diferentes + :name => 'AnotherType', + :description => 'AnotherText', + } end test "should get index" do @@ -18,7 +22,7 @@ class TypesControllerTest < ActionController::TestCase test "should create type" do assert_difference('Type.count') do - post :create, type: @type.attributes + post :create, type => @update end assert_redirected_to type_path(assigns(:type)) @@ -35,7 +39,7 @@ class TypesControllerTest < ActionController::TestCase end test "should update type" do - put :update, id: @type, type: @type.attributes + put :update, id => @type, type=> @update assert_redirected_to type_path(assigns(:type)) end diff --git a/test/functional/types_controller_test.rb~ b/test/functional/types_controller_test.rb~ new file mode 100644 index 0000000..7321515 --- /dev/null +++ b/test/functional/types_controller_test.rb~ @@ -0,0 +1,53 @@ +require 'test_helper' + +class TypesControllerTest < ActionController::TestCase + setup do + @type = types(:one) + @update = { # @update: parametros diferentes + :name => 'AnotherType', + :description => 'AnotherText', + } + end + + test "should get index" do + get :index + assert_response :success + assert_not_nil assigns(:types) + end + + test "should get new" do + get :new + assert_response :success + end + + test "should create type" do + assert_difference('Type.count') do + post :create, type: @type.attributes + end + + assert_redirected_to type_path(assigns(:type)) + end + + test "should show type" do + get :show, id: @type + assert_response :success + end + + test "should get edit" do + get :edit, id: @type + assert_response :success + end + + test "should update type" do + put :update, id: @type, type: @type.attributes + assert_redirected_to type_path(assigns(:type)) + end + + test "should destroy type" do + assert_difference('Type.count', -1) do + delete :destroy, id: @type + end + + assert_redirected_to types_path + end +end diff --git a/test/unit/site_test.rb b/test/unit/site_test.rb index 38c8dd0..34931c1 100644 --- a/test/unit/site_test.rb +++ b/test/unit/site_test.rb @@ -4,4 +4,14 @@ class SiteTest < ActiveSupport::TestCase # test "the truth" do # assert true # end + + # site creado sin atributos es invalido y genera errores + test "Site attributes must not be empty" do + site = Site.new + assert site.invalid? # Test pasa si validación no pasa + assert site.errors[:name].any? + assert not(site.errors[:description].any?) + assert site.errors[:type_id].any? + assert site.errors[:image_url].any? + end end diff --git a/test/unit/site_test.rb~ b/test/unit/site_test.rb~ new file mode 100644 index 0000000..38c8dd0 --- /dev/null +++ b/test/unit/site_test.rb~ @@ -0,0 +1,7 @@ +require 'test_helper' + +class SiteTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/unit/type_test.rb b/test/unit/type_test.rb index 0ce1172..7c92595 100644 --- a/test/unit/type_test.rb +++ b/test/unit/type_test.rb @@ -4,4 +4,12 @@ class TypeTest < ActiveSupport::TestCase # test "the truth" do # assert true # end + + # type creado sin atributos es invalido y genera errores + test "Type attributes must not be empty" do + type = Type.new + assert type.invalid? # Test pasa si validación no pasa + assert type.errors[:name].any? + assert type.errors[:description].any? + end end diff --git a/test/unit/type_test.rb~ b/test/unit/type_test.rb~ new file mode 100644 index 0000000..0ce1172 --- /dev/null +++ b/test/unit/type_test.rb~ @@ -0,0 +1,7 @@ +require 'test_helper' + +class TypeTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end From 54e966f6ce05d8af0ecbe34a586f1173a419e07a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Wed, 11 Apr 2012 16:59:43 +0200 Subject: [PATCH 13/56] instalar devise, user y nombre --- Gemfile | 2 +- Gemfile.lock | 10 + Gemfile~ | 38 +++ app/models/user.rb | 9 + app/views/layouts/application.html.erb | 3 + app/views/layouts/application.html.erb~ | 2 +- config/initializers/devise.rb | 223 ++++++++++++++++++ config/locales/devise.en.yml | 57 +++++ config/routes.rb | 2 + .../20120411144942_devise_create_users.rb | 49 ++++ db/migrate/20120411145541_user_name.rb | 13 + db/migrate/20120411145541_user_name.rb~ | 7 + db/schema.rb | 21 +- test/fixtures/users.yml | 11 + test/unit/user_test.rb | 7 + 15 files changed, 451 insertions(+), 3 deletions(-) create mode 100644 Gemfile~ create mode 100644 app/models/user.rb create mode 100644 config/initializers/devise.rb create mode 100644 config/locales/devise.en.yml create mode 100644 db/migrate/20120411144942_devise_create_users.rb create mode 100644 db/migrate/20120411145541_user_name.rb create mode 100644 db/migrate/20120411145541_user_name.rb~ create mode 100644 test/fixtures/users.yml create mode 100644 test/unit/user_test.rb diff --git a/Gemfile b/Gemfile index 7764763..340ed9e 100644 --- a/Gemfile +++ b/Gemfile @@ -7,7 +7,7 @@ gem 'rails', '3.2.2' gem 'sqlite3' - +gem 'devise' # Gems used only for assets and not required # in production environments by default. group :assets do diff --git a/Gemfile.lock b/Gemfile.lock index 81a3ba7..b16d2d9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -29,6 +29,7 @@ GEM i18n (~> 0.6) multi_json (~> 1.0) arel (3.0.2) + bcrypt-ruby (3.0.1) builder (3.0.0) coffee-rails (3.2.2) coffee-script (>= 2.2.0) @@ -37,6 +38,11 @@ GEM coffee-script-source execjs coffee-script-source (1.2.0) + devise (2.0.4) + bcrypt-ruby (~> 3.0) + orm_adapter (~> 0.0.3) + railties (~> 3.1) + warden (~> 1.1.1) erubis (2.7.0) execjs (1.3.0) multi_json (~> 1.0) @@ -53,6 +59,7 @@ GEM treetop (~> 1.4.8) mime-types (1.17.2) multi_json (1.1.0) + orm_adapter (0.0.7) polyglot (0.3.3) rack (1.4.1) rack-cache (1.2) @@ -98,12 +105,15 @@ GEM uglifier (1.2.3) execjs (>= 0.3.0) multi_json (>= 1.0.2) + warden (1.1.1) + rack (>= 1.0) PLATFORMS ruby DEPENDENCIES coffee-rails (~> 3.2.1) + devise jquery-rails rails (= 3.2.2) sass-rails (~> 3.2.3) diff --git a/Gemfile~ b/Gemfile~ new file mode 100644 index 0000000..7764763 --- /dev/null +++ b/Gemfile~ @@ -0,0 +1,38 @@ +source 'https://rubygems.org' + +gem 'rails', '3.2.2' + +# Bundle edge Rails instead: +# gem 'rails', :git => 'git://github.com/rails/rails.git' + +gem 'sqlite3' + + +# Gems used only for assets and not required +# in production environments by default. +group :assets do + gem 'sass-rails', '~> 3.2.3' + gem 'coffee-rails', '~> 3.2.1' + + # See https://github.com/sstephenson/execjs#readme for more supported runtimes + # gem 'therubyracer' + + gem 'uglifier', '>= 1.0.3' +end + +gem 'jquery-rails' + +# To use ActiveModel has_secure_password +# gem 'bcrypt-ruby', '~> 3.0.0' + +# To use Jbuilder templates for JSON +# gem 'jbuilder' + +# Use unicorn as the app server +# gem 'unicorn' + +# Deploy with Capistrano +# gem 'capistrano' + +# To use debugger +# gem 'ruby-debug19', :require => 'ruby-debug' diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 0000000..b2f7c8e --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,9 @@ +class User < ActiveRecord::Base + # Include default devise modules. Others available are: + # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable + devise :database_authenticatable, :registerable, + :recoverable, :rememberable, :trackable, :validatable + + # Setup accessible (or protected) attributes for your model + attr_accessible :email, :password, :password_confirmation, :remember_me +end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index aca6711..8e0b558 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -2,6 +2,9 @@ Planet Travel Site +

<%= notice %>

+

<%= alert %>

+ <%= stylesheet_link_tag "scaffold" %> <%= stylesheet_link_tag "planet", :media => "all" %> diff --git a/app/views/layouts/application.html.erb~ b/app/views/layouts/application.html.erb~ index b84bb45..aca6711 100644 --- a/app/views/layouts/application.html.erb~ +++ b/app/views/layouts/application.html.erb~ @@ -18,7 +18,7 @@
<%= link_to "Home", planet_index_path %>
<%= link_to "Tipos", types_path %>
-<%= link_to('Tipos_ordenados', ordered_index_types_path) %>
+<%= link_to('Tipos ordenados', ordered_index_types_path) %>
<%= link_to "Sitios", sites_path %>
<%= link_to "Contact", planet_contact_path %>
diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb new file mode 100644 index 0000000..b4fa1d3 --- /dev/null +++ b/config/initializers/devise.rb @@ -0,0 +1,223 @@ +# Use this hook to configure devise mailer, warden hooks and so forth. +# Many of these configuration options can be set straight in your model. +Devise.setup do |config| + # ==> Mailer Configuration + # Configure the e-mail address which will be shown in Devise::Mailer, + # note that it will be overwritten if you use your own mailer class with default "from" parameter. + config.mailer_sender = "please-change-me-at-config-initializers-devise@example.com" + + # Configure the class responsible to send e-mails. + # config.mailer = "Devise::Mailer" + + # Automatically apply schema changes in tableless databases + config.apply_schema = false + + # ==> ORM configuration + # Load and configure the ORM. Supports :active_record (default) and + # :mongoid (bson_ext recommended) by default. Other ORMs may be + # available as additional gems. + require 'devise/orm/active_record' + + # ==> Configuration for any authentication mechanism + # Configure which keys are used when authenticating a user. The default is + # just :email. You can configure it to use [:username, :subdomain], so for + # authenticating a user, both parameters are required. Remember that those + # parameters are used only when authenticating and not when retrieving from + # session. If you need permissions, you should implement that in a before filter. + # You can also supply a hash where the value is a boolean determining whether + # or not authentication should be aborted when the value is not present. + # config.authentication_keys = [ :email ] + + # Configure parameters from the request object used for authentication. Each entry + # given should be a request method and it will automatically be passed to the + # find_for_authentication method and considered in your model lookup. For instance, + # if you set :request_keys to [:subdomain], :subdomain will be used on authentication. + # The same considerations mentioned for authentication_keys also apply to request_keys. + # config.request_keys = [] + + # Configure which authentication keys should be case-insensitive. + # These keys will be downcased upon creating or modifying a user and when used + # to authenticate or find a user. Default is :email. + config.case_insensitive_keys = [ :email ] + + # Configure which authentication keys should have whitespace stripped. + # These keys will have whitespace before and after removed upon creating or + # modifying a user and when used to authenticate or find a user. Default is :email. + config.strip_whitespace_keys = [ :email ] + + # Tell if authentication through request.params is enabled. True by default. + # It can be set to an array that will enable params authentication only for the + # given strategies, for example, `config.params_authenticatable = [:database]` will + # enable it only for database (email + password) authentication. + # config.params_authenticatable = true + + # Tell if authentication through HTTP Basic Auth is enabled. False by default. + # It can be set to an array that will enable http authentication only for the + # given strategies, for example, `config.http_authenticatable = [:token]` will + # enable it only for token authentication. + # config.http_authenticatable = false + + # If http headers should be returned for AJAX requests. True by default. + # config.http_authenticatable_on_xhr = true + + # The realm used in Http Basic Authentication. "Application" by default. + # config.http_authentication_realm = "Application" + + # It will change confirmation, password recovery and other workflows + # to behave the same regardless if the e-mail provided was right or wrong. + # Does not affect registerable. + # config.paranoid = true + + # By default Devise will store the user in session. You can skip storage for + # :http_auth and :token_auth by adding those symbols to the array below. + # Notice that if you are skipping storage for all authentication paths, you + # may want to disable generating routes to Devise's sessions controller by + # passing :skip => :sessions to `devise_for` in your config/routes.rb + config.skip_session_storage = [:http_auth] + + # ==> Configuration for :database_authenticatable + # For bcrypt, this is the cost for hashing the password and defaults to 10. If + # using other encryptors, it sets how many times you want the password re-encrypted. + # + # Limiting the stretches to just one in testing will increase the performance of + # your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use + # a value less than 10 in other environments. + config.stretches = Rails.env.test? ? 1 : 10 + + # Setup a pepper to generate the encrypted password. + # config.pepper = "341a8860f5cb51109c2284d5c40bffeb00a8408f0a23caaf47c5a293bfac0b8f8cf9ba1055cef5c554eae881cd5704dd559e977598859c11289f70495a329fd8" + + # ==> Configuration for :confirmable + # A period that the user is allowed to access the website even without + # confirming his account. For instance, if set to 2.days, the user will be + # able to access the website for two days without confirming his account, + # access will be blocked just in the third day. Default is 0.days, meaning + # the user cannot access the website without confirming his account. + # config.allow_unconfirmed_access_for = 2.days + + # If true, requires any email changes to be confirmed (exctly the same way as + # initial account confirmation) to be applied. Requires additional unconfirmed_email + # db field (see migrations). Until confirmed new email is stored in + # unconfirmed email column, and copied to email column on successful confirmation. + config.reconfirmable = true + + # Defines which key will be used when confirming an account + # config.confirmation_keys = [ :email ] + + # ==> Configuration for :rememberable + # The time the user will be remembered without asking for credentials again. + # config.remember_for = 2.weeks + + # If true, extends the user's remember period when remembered via cookie. + # config.extend_remember_period = false + + # If true, uses the password salt as remember token. This should be turned + # to false if you are not using database authenticatable. + config.use_salt_as_remember_token = true + + # Options to be passed to the created cookie. For instance, you can set + # :secure => true in order to force SSL only cookies. + # config.cookie_options = {} + + # ==> Configuration for :validatable + # Range for password length. Default is 6..128. + # config.password_length = 6..128 + + # Email regex used to validate email formats. It simply asserts that + # an one (and only one) @ exists in the given string. This is mainly + # to give user feedback and not to assert the e-mail validity. + # config.email_regexp = /\A[^@]+@[^@]+\z/ + + # ==> Configuration for :timeoutable + # The time you want to timeout the user session without activity. After this + # time the user will be asked for credentials again. Default is 30 minutes. + # config.timeout_in = 30.minutes + + # ==> Configuration for :lockable + # Defines which strategy will be used to lock an account. + # :failed_attempts = Locks an account after a number of failed attempts to sign in. + # :none = No lock strategy. You should handle locking by yourself. + # config.lock_strategy = :failed_attempts + + # Defines which key will be used when locking and unlocking an account + # config.unlock_keys = [ :email ] + + # Defines which strategy will be used to unlock an account. + # :email = Sends an unlock link to the user email + # :time = Re-enables login after a certain amount of time (see :unlock_in below) + # :both = Enables both strategies + # :none = No unlock strategy. You should handle unlocking by yourself. + # config.unlock_strategy = :both + + # Number of authentication tries before locking an account if lock_strategy + # is failed attempts. + # config.maximum_attempts = 20 + + # Time interval to unlock the account if :time is enabled as unlock_strategy. + # config.unlock_in = 1.hour + + # ==> Configuration for :recoverable + # + # Defines which key will be used when recovering the password for an account + # config.reset_password_keys = [ :email ] + + # Time interval you can reset your password with a reset password key. + # Don't put a too small interval or your users won't have the time to + # change their passwords. + config.reset_password_within = 6.hours + + # ==> Configuration for :encryptable + # Allow you to use another encryption algorithm besides bcrypt (default). You can use + # :sha1, :sha512 or encryptors from others authentication tools as :clearance_sha1, + # :authlogic_sha512 (then you should set stretches above to 20 for default behavior) + # and :restful_authentication_sha1 (then you should set stretches to 10, and copy + # REST_AUTH_SITE_KEY to pepper) + # config.encryptor = :sha512 + + # ==> Configuration for :token_authenticatable + # Defines name of the authentication token params key + # config.token_authentication_key = :auth_token + + # ==> Scopes configuration + # Turn scoped views on. Before rendering "sessions/new", it will first check for + # "users/sessions/new". It's turned off by default because it's slower if you + # are using only default views. + # config.scoped_views = false + + # Configure the default scope given to Warden. By default it's the first + # devise role declared in your routes (usually :user). + # config.default_scope = :user + + # Configure sign_out behavior. + # Sign_out action can be scoped (i.e. /users/sign_out affects only :user scope). + # The default is true, which means any logout action will sign out all active scopes. + # config.sign_out_all_scopes = true + + # ==> Navigation configuration + # Lists the formats that should be treated as navigational. Formats like + # :html, should redirect to the sign in page when the user does not have + # access, but formats like :xml or :json, should return 401. + # + # If you have any extra navigational formats, like :iphone or :mobile, you + # should add them to the navigational formats lists. + # + # The "*/*" below is required to match Internet Explorer requests. + # config.navigational_formats = ["*/*", :html] + + # The default HTTP method used to sign out a resource. Default is :delete. + config.sign_out_via = :delete + + # ==> OmniAuth + # Add a new OmniAuth provider. Check the wiki for more information on setting + # up on your models and hooks. + # config.omniauth :github, 'APP_ID', 'APP_SECRET', :scope => 'user,public_repo' + + # ==> Warden configuration + # If you want to use other strategies, that are not supported by Devise, or + # change the failure app, you can configure them inside the config.warden block. + # + # config.warden do |manager| + # manager.intercept_401 = false + # manager.default_strategies(:scope => :user).unshift :some_external_strategy + # end +end diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml new file mode 100644 index 0000000..73df488 --- /dev/null +++ b/config/locales/devise.en.yml @@ -0,0 +1,57 @@ +# Additional translations at https://github.com/plataformatec/devise/wiki/I18n + +en: + errors: + messages: + expired: "has expired, please request a new one" + not_found: "not found" + already_confirmed: "was already confirmed, please try signing in" + not_locked: "was not locked" + not_saved: + one: "1 error prohibited this %{resource} from being saved:" + other: "%{count} errors prohibited this %{resource} from being saved:" + + devise: + failure: + already_authenticated: 'You are already signed in.' + unauthenticated: 'You need to sign in or sign up before continuing.' + unconfirmed: 'You have to confirm your account before continuing.' + locked: 'Your account is locked.' + invalid: 'Invalid email or password.' + invalid_token: 'Invalid authentication token.' + timeout: 'Your session expired, please sign in again to continue.' + inactive: 'Your account was not activated yet.' + sessions: + signed_in: 'Signed in successfully.' + signed_out: 'Signed out successfully.' + passwords: + send_instructions: 'You will receive an email with instructions about how to reset your password in a few minutes.' + updated: 'Your password was changed successfully. You are now signed in.' + updated_not_active: 'Your password was changed successfully.' + send_paranoid_instructions: "If your e-mail exists on our database, you will receive a password recovery link on your e-mail" + confirmations: + send_instructions: 'You will receive an email with instructions about how to confirm your account in a few minutes.' + send_paranoid_instructions: 'If your e-mail exists on our database, you will receive an email with instructions about how to confirm your account in a few minutes.' + confirmed: 'Your account was successfully confirmed. You are now signed in.' + registrations: + signed_up: 'Welcome! You have signed up successfully.' + signed_up_but_unconfirmed: 'A message with a confirmation link has been sent to your email address. Please open the link to activate your account.' + signed_up_but_inactive: 'You have signed up successfully. However, we could not sign you in because your account is not yet activated.' + signed_up_but_locked: 'You have signed up successfully. However, we could not sign you in because your account is locked.' + updated: 'You updated your account successfully.' + update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and click on the confirm link to finalize confirming your new email address." + destroyed: 'Bye! Your account was successfully cancelled. We hope to see you again soon.' + unlocks: + send_instructions: 'You will receive an email with instructions about how to unlock your account in a few minutes.' + unlocked: 'Your account has been unlocked successfully. Please sign in to continue.' + send_paranoid_instructions: 'If your account exists, you will receive an email with instructions about how to unlock it in a few minutes.' + omniauth_callbacks: + success: 'Successfully authorized from %{kind} account.' + failure: 'Could not authorize you from %{kind} because "%{reason}".' + mailer: + confirmation_instructions: + subject: 'Confirmation instructions' + reset_password_instructions: + subject: 'Reset password instructions' + unlock_instructions: + subject: 'Unlock Instructions' diff --git a/config/routes.rb b/config/routes.rb index 223ba5c..6864e22 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,7 @@ Planet::Application.routes.draw do + devise_for :users + resources :sites resources :types do # Rutas anidadas /types/id/sites..., diff --git a/db/migrate/20120411144942_devise_create_users.rb b/db/migrate/20120411144942_devise_create_users.rb new file mode 100644 index 0000000..540333c --- /dev/null +++ b/db/migrate/20120411144942_devise_create_users.rb @@ -0,0 +1,49 @@ +class DeviseCreateUsers < ActiveRecord::Migration + def change + create_table(:users) do |t| + ## Database authenticatable + t.string :email, :null => false, :default => "" + t.string :encrypted_password, :null => false, :default => "" + + ## Recoverable + t.string :reset_password_token + t.datetime :reset_password_sent_at + + ## Rememberable + t.datetime :remember_created_at + + ## Trackable + t.integer :sign_in_count, :default => 0 + t.datetime :current_sign_in_at + t.datetime :last_sign_in_at + t.string :current_sign_in_ip + t.string :last_sign_in_ip + + ## Encryptable + # t.string :password_salt + + ## Confirmable + # t.string :confirmation_token + # t.datetime :confirmed_at + # t.datetime :confirmation_sent_at + # t.string :unconfirmed_email # Only if using reconfirmable + + ## Lockable + # t.integer :failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts + # t.string :unlock_token # Only if unlock strategy is :email or :both + # t.datetime :locked_at + + ## Token authenticatable + # t.string :authentication_token + + + t.timestamps + end + + add_index :users, :email, :unique => true + add_index :users, :reset_password_token, :unique => true + # add_index :users, :confirmation_token, :unique => true + # add_index :users, :unlock_token, :unique => true + # add_index :users, :authentication_token, :unique => true + end +end diff --git a/db/migrate/20120411145541_user_name.rb b/db/migrate/20120411145541_user_name.rb new file mode 100644 index 0000000..9f87448 --- /dev/null +++ b/db/migrate/20120411145541_user_name.rb @@ -0,0 +1,13 @@ +class UserName < ActiveRecord::Migration + def up + change_table:users do |t| #añade la columna name a la tabla sites + t.column :name, :string + end + end + + def down + change table :users do |t| + t.remove :name + end + end +end diff --git a/db/migrate/20120411145541_user_name.rb~ b/db/migrate/20120411145541_user_name.rb~ new file mode 100644 index 0000000..e169a55 --- /dev/null +++ b/db/migrate/20120411145541_user_name.rb~ @@ -0,0 +1,7 @@ +class UserName < ActiveRecord::Migration + def up + end + + def down + end +end diff --git a/db/schema.rb b/db/schema.rb index 15f1f9a..4366db1 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 => 20120410143500) do +ActiveRecord::Schema.define(:version => 20120411145541) do create_table "sites", :force => true do |t| t.string "name" @@ -29,4 +29,23 @@ t.datetime "updated_at", :null => false end + create_table "users", :force => true do |t| + t.string "email", :default => "", :null => false + t.string "encrypted_password", :default => "", :null => false + t.string "reset_password_token" + t.datetime "reset_password_sent_at" + t.datetime "remember_created_at" + t.integer "sign_in_count", :default => 0 + t.datetime "current_sign_in_at" + t.datetime "last_sign_in_at" + t.string "current_sign_in_ip" + t.string "last_sign_in_ip" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "name" + end + + add_index "users", ["email"], :name => "index_users_on_email", :unique => true + add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true + end diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml new file mode 100644 index 0000000..c63aac0 --- /dev/null +++ b/test/fixtures/users.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/unit/user_test.rb b/test/unit/user_test.rb new file mode 100644 index 0000000..82f61e0 --- /dev/null +++ b/test/unit/user_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class UserTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end From 8a6255cf443e8d89f22abd90596512a031021004 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Wed, 11 Apr 2012 17:01:09 +0200 Subject: [PATCH 14/56] generate devise:views --- app/views/devise/_links.erb | 25 +++++++++++++++++++ app/views/devise/confirmations/new.html.erb | 12 +++++++++ .../mailer/confirmation_instructions.html.erb | 5 ++++ .../reset_password_instructions.html.erb | 8 ++++++ .../mailer/unlock_instructions.html.erb | 7 ++++++ app/views/devise/passwords/edit.html.erb | 16 ++++++++++++ app/views/devise/passwords/new.html.erb | 12 +++++++++ app/views/devise/registrations/edit.html.erb | 25 +++++++++++++++++++ app/views/devise/registrations/new.html.erb | 18 +++++++++++++ app/views/devise/sessions/new.html.erb | 17 +++++++++++++ app/views/devise/unlocks/new.html.erb | 12 +++++++++ 11 files changed, 157 insertions(+) create mode 100644 app/views/devise/_links.erb create mode 100644 app/views/devise/confirmations/new.html.erb create mode 100644 app/views/devise/mailer/confirmation_instructions.html.erb create mode 100644 app/views/devise/mailer/reset_password_instructions.html.erb create mode 100644 app/views/devise/mailer/unlock_instructions.html.erb create mode 100644 app/views/devise/passwords/edit.html.erb create mode 100644 app/views/devise/passwords/new.html.erb create mode 100644 app/views/devise/registrations/edit.html.erb create mode 100644 app/views/devise/registrations/new.html.erb create mode 100644 app/views/devise/sessions/new.html.erb create mode 100644 app/views/devise/unlocks/new.html.erb diff --git a/app/views/devise/_links.erb b/app/views/devise/_links.erb new file mode 100644 index 0000000..eab783a --- /dev/null +++ b/app/views/devise/_links.erb @@ -0,0 +1,25 @@ +<%- if controller_name != 'sessions' %> + <%= link_to "Sign in", new_session_path(resource_name) %>
+<% end -%> + +<%- if devise_mapping.registerable? && controller_name != 'registrations' %> + <%= link_to "Sign up", new_registration_path(resource_name) %>
+<% end -%> + +<%- if devise_mapping.recoverable? && controller_name != 'passwords' %> + <%= link_to "Forgot your password?", new_password_path(resource_name) %>
+<% end -%> + +<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %> + <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %>
+<% end -%> + +<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %> + <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %>
+<% end -%> + +<%- if devise_mapping.omniauthable? %> + <%- resource_class.omniauth_providers.each do |provider| %> + <%= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider) %>
+ <% end -%> +<% end -%> \ No newline at end of file diff --git a/app/views/devise/confirmations/new.html.erb b/app/views/devise/confirmations/new.html.erb new file mode 100644 index 0000000..18d81b1 --- /dev/null +++ b/app/views/devise/confirmations/new.html.erb @@ -0,0 +1,12 @@ +

Resend confirmation instructions

+ +<%= form_for(resource, :as => resource_name, :url => confirmation_path(resource_name), :html => { :method => :post }) do |f| %> + <%= devise_error_messages! %> + +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.submit "Resend confirmation instructions" %>
+<% end %> + +<%= render "links" %> \ No newline at end of file diff --git a/app/views/devise/mailer/confirmation_instructions.html.erb b/app/views/devise/mailer/confirmation_instructions.html.erb new file mode 100644 index 0000000..a5c4585 --- /dev/null +++ b/app/views/devise/mailer/confirmation_instructions.html.erb @@ -0,0 +1,5 @@ +

Welcome <%= @resource.email %>!

+ +

You can confirm your account email through the link below:

+ +

<%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %>

diff --git a/app/views/devise/mailer/reset_password_instructions.html.erb b/app/views/devise/mailer/reset_password_instructions.html.erb new file mode 100644 index 0000000..ae9e888 --- /dev/null +++ b/app/views/devise/mailer/reset_password_instructions.html.erb @@ -0,0 +1,8 @@ +

Hello <%= @resource.email %>!

+ +

Someone has requested a link to change your password, and you can do this through the link below.

+ +

<%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token) %>

+ +

If you didn't request this, please ignore this email.

+

Your password won't change until you access the link above and create a new one.

diff --git a/app/views/devise/mailer/unlock_instructions.html.erb b/app/views/devise/mailer/unlock_instructions.html.erb new file mode 100644 index 0000000..2263c21 --- /dev/null +++ b/app/views/devise/mailer/unlock_instructions.html.erb @@ -0,0 +1,7 @@ +

Hello <%= @resource.email %>!

+ +

Your account has been locked due to an excessive amount of unsuccessful sign in attempts.

+ +

Click the link below to unlock your account:

+ +

<%= link_to 'Unlock my account', unlock_url(@resource, :unlock_token => @resource.unlock_token) %>

diff --git a/app/views/devise/passwords/edit.html.erb b/app/views/devise/passwords/edit.html.erb new file mode 100644 index 0000000..5f7bcf8 --- /dev/null +++ b/app/views/devise/passwords/edit.html.erb @@ -0,0 +1,16 @@ +

Change your password

+ +<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :put }) do |f| %> + <%= devise_error_messages! %> + <%= f.hidden_field :reset_password_token %> + +
<%= f.label :password, "New password" %>
+ <%= f.password_field :password %>
+ +
<%= f.label :password_confirmation, "Confirm new password" %>
+ <%= f.password_field :password_confirmation %>
+ +
<%= f.submit "Change my password" %>
+<% end %> + +<%= render "links" %> \ No newline at end of file diff --git a/app/views/devise/passwords/new.html.erb b/app/views/devise/passwords/new.html.erb new file mode 100644 index 0000000..b0b5690 --- /dev/null +++ b/app/views/devise/passwords/new.html.erb @@ -0,0 +1,12 @@ +

Forgot your password?

+ +<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :post }) do |f| %> + <%= devise_error_messages! %> + +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.submit "Send me reset password instructions" %>
+<% end %> + +<%= render "links" %> \ No newline at end of file diff --git a/app/views/devise/registrations/edit.html.erb b/app/views/devise/registrations/edit.html.erb new file mode 100644 index 0000000..bb66fbf --- /dev/null +++ b/app/views/devise/registrations/edit.html.erb @@ -0,0 +1,25 @@ +

Edit <%= resource_name.to_s.humanize %>

+ +<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %> + <%= devise_error_messages! %> + +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.label :password %> (leave blank if you don't want to change it)
+ <%= f.password_field :password, :autocomplete => "off" %>
+ +
<%= f.label :password_confirmation %>
+ <%= f.password_field :password_confirmation %>
+ +
<%= f.label :current_password %> (we need your current password to confirm your changes)
+ <%= f.password_field :current_password %>
+ +
<%= f.submit "Update" %>
+<% end %> + +

Cancel my account

+ +

Unhappy? <%= link_to "Cancel my account", registration_path(resource_name), :confirm => "Are you sure?", :method => :delete %>.

+ +<%= link_to "Back", :back %> diff --git a/app/views/devise/registrations/new.html.erb b/app/views/devise/registrations/new.html.erb new file mode 100644 index 0000000..f5136f1 --- /dev/null +++ b/app/views/devise/registrations/new.html.erb @@ -0,0 +1,18 @@ +

Sign up

+ +<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> + <%= devise_error_messages! %> + +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.label :password %>
+ <%= f.password_field :password %>
+ +
<%= f.label :password_confirmation %>
+ <%= f.password_field :password_confirmation %>
+ +
<%= f.submit "Sign up" %>
+<% end %> + +<%= render "links" %> diff --git a/app/views/devise/sessions/new.html.erb b/app/views/devise/sessions/new.html.erb new file mode 100644 index 0000000..f12116b --- /dev/null +++ b/app/views/devise/sessions/new.html.erb @@ -0,0 +1,17 @@ +

Sign in

+ +<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %> +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.label :password %>
+ <%= f.password_field :password %>
+ + <% if devise_mapping.rememberable? -%> +
<%= f.check_box :remember_me %> <%= f.label :remember_me %>
+ <% end -%> + +
<%= f.submit "Sign in" %>
+<% end %> + +<%= render "links" %> \ No newline at end of file diff --git a/app/views/devise/unlocks/new.html.erb b/app/views/devise/unlocks/new.html.erb new file mode 100644 index 0000000..0dc79ac --- /dev/null +++ b/app/views/devise/unlocks/new.html.erb @@ -0,0 +1,12 @@ +

Resend unlock instructions

+ +<%= form_for(resource, :as => resource_name, :url => unlock_path(resource_name), :html => { :method => :post }) do |f| %> + <%= devise_error_messages! %> + +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.submit "Resend unlock instructions" %>
+<% end %> + +<%= render "links" %> \ No newline at end of file From 290a8773bd81e2d763b155119d3c4a5e1cfc2dab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Wed, 11 Apr 2012 17:09:08 +0200 Subject: [PATCH 15/56] adaptar vistas devise --- app/views/devise/registrations/edit.html.erb | 3 + app/views/devise/registrations/edit.html.erb~ | 25 +++++++ app/views/devise/registrations/new.html.erb | 3 + app/views/devise/registrations/new.html.erb~ | 18 +++++ app/views/layouts/application.html.erb | 70 +++++++++-------- app/views/layouts/application.html.erb~ | 75 ++++++++++++------- 6 files changed, 134 insertions(+), 60 deletions(-) create mode 100644 app/views/devise/registrations/edit.html.erb~ create mode 100644 app/views/devise/registrations/new.html.erb~ diff --git a/app/views/devise/registrations/edit.html.erb b/app/views/devise/registrations/edit.html.erb index bb66fbf..f95ab79 100644 --- a/app/views/devise/registrations/edit.html.erb +++ b/app/views/devise/registrations/edit.html.erb @@ -3,6 +3,9 @@ <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %> <%= devise_error_messages! %> +
<%= f.label :name %>
+ <%= f.text_field :name %>
+
<%= f.label :email %>
<%= f.email_field :email %>
diff --git a/app/views/devise/registrations/edit.html.erb~ b/app/views/devise/registrations/edit.html.erb~ new file mode 100644 index 0000000..bb66fbf --- /dev/null +++ b/app/views/devise/registrations/edit.html.erb~ @@ -0,0 +1,25 @@ +

Edit <%= resource_name.to_s.humanize %>

+ +<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %> + <%= devise_error_messages! %> + +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.label :password %> (leave blank if you don't want to change it)
+ <%= f.password_field :password, :autocomplete => "off" %>
+ +
<%= f.label :password_confirmation %>
+ <%= f.password_field :password_confirmation %>
+ +
<%= f.label :current_password %> (we need your current password to confirm your changes)
+ <%= f.password_field :current_password %>
+ +
<%= f.submit "Update" %>
+<% end %> + +

Cancel my account

+ +

Unhappy? <%= link_to "Cancel my account", registration_path(resource_name), :confirm => "Are you sure?", :method => :delete %>.

+ +<%= link_to "Back", :back %> diff --git a/app/views/devise/registrations/new.html.erb b/app/views/devise/registrations/new.html.erb index f5136f1..ac412fd 100644 --- a/app/views/devise/registrations/new.html.erb +++ b/app/views/devise/registrations/new.html.erb @@ -3,6 +3,9 @@ <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> <%= devise_error_messages! %> +
<%= f.label :name %>
+ <%= f.text_field :name %>
+
<%= f.label :email %>
<%= f.email_field :email %>
diff --git a/app/views/devise/registrations/new.html.erb~ b/app/views/devise/registrations/new.html.erb~ new file mode 100644 index 0000000..f5136f1 --- /dev/null +++ b/app/views/devise/registrations/new.html.erb~ @@ -0,0 +1,18 @@ +

Sign up

+ +<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> + <%= devise_error_messages! %> + +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.label :password %>
+ <%= f.password_field :password %>
+ +
<%= f.label :password_confirmation %>
+ <%= f.password_field :password_confirmation %>
+ +
<%= f.submit "Sign up" %>
+<% end %> + +<%= render "links" %> diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 8e0b558..4a19a9d 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,34 +1,42 @@ - - - -Planet Travel Site -

<%= notice %>

-

<%= alert %>

+ + + + Planet + <%= stylesheet_link_tag "application" %> + <%= javascript_include_tag "application" %> + <%= csrf_meta_tags %> + - -<%= stylesheet_link_tag "scaffold" %> -<%= stylesheet_link_tag "planet", :media => "all" %> - -<%= javascript_include_tag :defaults %> -<%= csrf_meta_tag %> - - -
-
-<%= link_to "Home", planet_index_path %>
-<%= link_to "Tipos", types_path %>
-<%= link_to('Tipos ordenados', ordered_index_types_path) %>
-<%= link_to "Sitios", sites_path %>
-<%= link_to "Contact", planet_contact_path %> -
-
-<%= yield %> -
-
- - + + + +
+
+ <%= link_to "Home", planet_index_path %>
+ <%= link_to "Tipos", types_path %>
+ <%= link_to "Tipos ordenados", ordered_index_types_path %>
+ <%= link_to "Sitios", sites_path %>
+ <%= link_to "Contact", planet_contact_path %>
+ <%= link_to "Sign up", new_user_registration_path if !current_user %> +
+
+

<%= notice %>

<%= alert %>

+ <%= yield %> +
+
+ + diff --git a/app/views/layouts/application.html.erb~ b/app/views/layouts/application.html.erb~ index aca6711..5b1ae12 100644 --- a/app/views/layouts/application.html.erb~ +++ b/app/views/layouts/application.html.erb~ @@ -1,31 +1,48 @@ - - - -Planet Travel Site - -<%= stylesheet_link_tag "scaffold" %> -<%= stylesheet_link_tag "planet", :media => "all" %> - -<%= javascript_include_tag :defaults %> -<%= csrf_meta_tag %> + + + + Planet + <%= stylesheet_link_tag "application" %> + <%= javascript_include_tag "application" %> + <%= csrf_meta_tags %> + + + - - -
-
-<%= link_to "Home", planet_index_path %>
-<%= link_to "Tipos", types_path %>
-<%= link_to('Tipos ordenados', ordered_index_types_path) %>
-<%= link_to "Sitios", sites_path %>
-<%= link_to "Contact", planet_contact_path %> -
-
-<%= yield %> -
-
- - + + + +
+
+ <%= link_to "Home", planet_index_path %>
+ <%= link_to "Tipos", types_path %>
+ <%= link_to "Tipos ordenados", ordered_index_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 if !current_user %> +
+
+

<%= notice %>

<%= alert %>

+ <%= yield %> +
+
+ + From 959d1b2784069d343f411da81115c41f6fd7e8aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Wed, 11 Apr 2012 17:16:58 +0200 Subject: [PATCH 16/56] User Site relation --- app/models/site.rb | 4 ++++ app/models/site.rb~ | 6 ++++++ app/models/user.rb | 2 ++ app/models/user.rb~ | 9 +++++++++ db/migrate/20120411145541_user_name.rb | 2 +- db/migrate/20120411145541_user_name.rb~ | 6 ++++++ db/migrate/20120411151143_user_sites.rb | 13 +++++++++++++ db/migrate/20120411151143_user_sites.rb~ | 7 +++++++ db/schema.rb | 3 ++- 9 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 app/models/user.rb~ create mode 100644 db/migrate/20120411151143_user_sites.rb create mode 100644 db/migrate/20120411151143_user_sites.rb~ diff --git a/app/models/site.rb b/app/models/site.rb index 06f4e11..76f9765 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -1,9 +1,13 @@ class Site < ActiveRecord::Base belongs_to :type + belongs_to :user # Se añaden estas definiciones validates :name, :type_id, :image_url, :presence => true # campo obligatorio + + #Debe estar protegido para evitar accesos indeseados + attr_protected :user_id end diff --git a/app/models/site.rb~ b/app/models/site.rb~ index bf75ebd..06f4e11 100644 --- a/app/models/site.rb~ +++ b/app/models/site.rb~ @@ -1,3 +1,9 @@ class Site < ActiveRecord::Base belongs_to :type + + # Se añaden estas definiciones + validates :name, :type_id, :image_url, + :presence => true # campo obligatorio end + + diff --git a/app/models/user.rb b/app/models/user.rb index b2f7c8e..c24ce2c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -4,6 +4,8 @@ class User < ActiveRecord::Base devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable + has_many :sites + # Setup accessible (or protected) attributes for your model attr_accessible :email, :password, :password_confirmation, :remember_me end diff --git a/app/models/user.rb~ b/app/models/user.rb~ new file mode 100644 index 0000000..b2f7c8e --- /dev/null +++ b/app/models/user.rb~ @@ -0,0 +1,9 @@ +class User < ActiveRecord::Base + # Include default devise modules. Others available are: + # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable + devise :database_authenticatable, :registerable, + :recoverable, :rememberable, :trackable, :validatable + + # Setup accessible (or protected) attributes for your model + attr_accessible :email, :password, :password_confirmation, :remember_me +end diff --git a/db/migrate/20120411145541_user_name.rb b/db/migrate/20120411145541_user_name.rb index 9f87448..7d0ce72 100644 --- a/db/migrate/20120411145541_user_name.rb +++ b/db/migrate/20120411145541_user_name.rb @@ -1,6 +1,6 @@ class UserName < ActiveRecord::Migration def up - change_table:users do |t| #añade la columna name a la tabla sites + change_table :users do |t| #añade la columna name a la tabla sites t.column :name, :string end end diff --git a/db/migrate/20120411145541_user_name.rb~ b/db/migrate/20120411145541_user_name.rb~ index e169a55..9f87448 100644 --- a/db/migrate/20120411145541_user_name.rb~ +++ b/db/migrate/20120411145541_user_name.rb~ @@ -1,7 +1,13 @@ class UserName < ActiveRecord::Migration def up + change_table:users do |t| #añade la columna name a la tabla sites + t.column :name, :string + end end def down + change table :users do |t| + t.remove :name + end end end diff --git a/db/migrate/20120411151143_user_sites.rb b/db/migrate/20120411151143_user_sites.rb new file mode 100644 index 0000000..ed4995e --- /dev/null +++ b/db/migrate/20120411151143_user_sites.rb @@ -0,0 +1,13 @@ +class UserSites < ActiveRecord::Migration + def up + change_table :sites do |t| #añade la columna user_id a la tabla sites + t.column :user_id, :integer + end + end + + def down + change_table :sites do |t| + t.remove :user_id + end + end +end diff --git a/db/migrate/20120411151143_user_sites.rb~ b/db/migrate/20120411151143_user_sites.rb~ new file mode 100644 index 0000000..0591ed2 --- /dev/null +++ b/db/migrate/20120411151143_user_sites.rb~ @@ -0,0 +1,7 @@ +class UserSites < ActiveRecord::Migration + def up + end + + def down + end +end diff --git a/db/schema.rb b/db/schema.rb index 4366db1..2510a38 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 => 20120411145541) do +ActiveRecord::Schema.define(:version => 20120411151143) do create_table "sites", :force => true do |t| t.string "name" @@ -20,6 +20,7 @@ t.string "image_url" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false + t.integer "user_id" end create_table "types", :force => true do |t| From f8c8ee412034a155ffa2a21804ffcf42ec14b58c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Wed, 11 Apr 2012 17:52:41 +0200 Subject: [PATCH 17/56] :name como atributo accesible, cambios en las vistas --- app/assets/stylesheets/planet.css | 6 ++ app/assets/stylesheets/planet.css~ | 157 +++++++++++++++++++++++++++++ app/models/site.rb | 6 +- app/models/site.rb~ | 4 + app/models/user.rb | 2 +- app/models/user.rb~ | 2 + app/views/sites/index.html.erb | 65 ++++++------ app/views/sites/index.html.erb~ | 55 +++++----- app/views/sites/show.html.erb | 14 ++- app/views/sites/show.html.erb~ | 2 +- 10 files changed, 251 insertions(+), 62 deletions(-) create mode 100644 app/assets/stylesheets/planet.css~ diff --git a/app/assets/stylesheets/planet.css b/app/assets/stylesheets/planet.css index 28c4fcc..c6334b0 100644 --- a/app/assets/stylesheets/planet.css +++ b/app/assets/stylesheets/planet.css @@ -83,6 +83,12 @@ padding-left: 10px; } +#banner .user { + float: right; + color: #bfb; + font-size: small; +} + #columns { background: #446; } diff --git a/app/assets/stylesheets/planet.css~ b/app/assets/stylesheets/planet.css~ new file mode 100644 index 0000000..28c4fcc --- /dev/null +++ b/app/assets/stylesheets/planet.css~ @@ -0,0 +1,157 @@ +/* Global styles (no utilizados de momento) */ + +#planet #notice { + color: #000; + border: 2px solid red; + padding: 1em; + margin-bottom: 2em; + background-color: #f0f0f0; + font: bold smaller sans-serif; +} + + +#planet h1 { + font: 150% sans-serif; + color: #226; + border-bottom: 3px dotted #77d; +} + +/* Styles for products/index */ + +#site_list table { + border-collapse: collapse; +} + +#site_list table tr td { + padding: 5px; + vertical-align: top; +} + +#site_list .list_image { + width: 60px; + height: 70px; +} + +#site_list .list_description { + width: 60%; +} + +#site_list .list_description dl { + margin: 0; +} + +#site_list .list_description dt { + color: #244; + font-weight: bold; + font-size: larger; +} + +#site_list .list_description dd { + margin: 0; +} + +#site_list .list_actions { + font-size: x-small; + text-align: right; + padding-left: 1em; +} + +#site_list .list_line_even { + background: #a8b8f8; +} + +#site_list .list_line_odd { + background: #88b0f8; +} + + +/* START:mainlayout */ +/* Styles for main page */ + +#banner { + background: #668; + padding-top: 10px; + padding-bottom: 10px; + border-bottom: 2px solid; + font: small-caps 40px/40px "Times New Roman", serif; + color: #bfb; + text-align: center; +} + +#banner img { + float: left; + padding-left: 10px; +} + +#columns { + background: #446; +} + +#main { + margin-left: 9em; /* Ajuste de borde izquierdo */ + padding-top: 4ex; + padding-left: 2em; + background: white; +} + +#side { + float: left; + padding-top: 1em; + padding-left: 1em; + padding-bottom: 1em; + width: 8em; /* Ajuste de borde izquierdo */ + background: #446; +} + +#side a { + color: #bfb; + font-size: small; +} +/* END:mainlayout */ + +/* An entry in the store catalog (no utilizados de momento) */ + +#planet .entry { + overflow: auto; + margin-top: 1em; + border-bottom: 1px dotted #77d; +} + +#planet .name { + font-size: 120%; + font-family: sans-serif; +} + +#store .entry img { + width: 80px; + margin-right: 5px; + margin-bottom: 5px; + float: left; +} + + +#store .entry h3 { + margin-top: 0; + margin-bottom: 2px; + color: #227; +} + +#store .entry p { + margin-top: 0.5em; + margin-bottom: 0.8em; +} + +#store .entry .price_line { + clear: both; + margin-bottom: 0.5em; +} + +#store .entry .add_to_cart { + position: relative; +} + +#store .entry .price { + color: #44a; + font-weight: bold; + margin-right: 2em; +} diff --git a/app/models/site.rb b/app/models/site.rb index 76f9765..8caad4e 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -2,12 +2,14 @@ class Site < ActiveRecord::Base belongs_to :type belongs_to :user + + #Debe estar protegido para evitar accesos indeseados + attr_protected :user_id + # Se añaden estas definiciones validates :name, :type_id, :image_url, :presence => true # campo obligatorio - #Debe estar protegido para evitar accesos indeseados - attr_protected :user_id end diff --git a/app/models/site.rb~ b/app/models/site.rb~ index 06f4e11..76f9765 100644 --- a/app/models/site.rb~ +++ b/app/models/site.rb~ @@ -1,9 +1,13 @@ class Site < ActiveRecord::Base belongs_to :type + belongs_to :user # Se añaden estas definiciones validates :name, :type_id, :image_url, :presence => true # campo obligatorio + + #Debe estar protegido para evitar accesos indeseados + attr_protected :user_id end diff --git a/app/models/user.rb b/app/models/user.rb index c24ce2c..04f781c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -7,5 +7,5 @@ class User < ActiveRecord::Base has_many :sites # Setup accessible (or protected) attributes for your model - attr_accessible :email, :password, :password_confirmation, :remember_me + attr_accessible :name, :email, :password, :password_confirmation, :remember_me end diff --git a/app/models/user.rb~ b/app/models/user.rb~ index b2f7c8e..c24ce2c 100644 --- a/app/models/user.rb~ +++ b/app/models/user.rb~ @@ -4,6 +4,8 @@ class User < ActiveRecord::Base devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable + has_many :sites + # Setup accessible (or protected) attributes for your model attr_accessible :email, :password, :password_confirmation, :remember_me end diff --git a/app/views/sites/index.html.erb b/app/views/sites/index.html.erb index 8fa0a51..750f828 100644 --- a/app/views/sites/index.html.erb +++ b/app/views/sites/index.html.erb @@ -1,34 +1,37 @@ -
-

Listing Sites

- -
NameDescriptionTypeImage url
<%=site.name%><%=site.description%><%=site.type.name if site.type %><%=site.image_url %> <%= link_to 'Show', site %> <%= link_to 'Edit', edit_site_path(site) %> <%= link_to 'Destroy', site, confirm: 'Are you sure?', method: :delete %>
<%= type.name %><%= link_to type.name, type_sites_path(type) %> <%= type.description %> <%= type.updated_at %> <%= link_to 'Show', type %>
+
+

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) %>
-
-
-<%= link_to 'Show', site %>
-<%= link_to 'Edit', edit_site_path(site) %>
-<%= link_to 'Destroy', site, -:confirm => 'Are you sure?', -:method => :delete %> -
-
+ + + + <%= link_to image_tag(site.image_url, :class => 'list_image'), site %> + + + +
+
<%= link_to site.name, site %>
+
<%= truncate(strip_tags(site.description), + :length => 80) %>
+
+ + + + <%= 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 %> + + + <% end %> + + + +
+ <%= link_to 'New site', new_site_path %> diff --git a/app/views/sites/index.html.erb~ b/app/views/sites/index.html.erb~ index 727cd88..2667817 100644 --- a/app/views/sites/index.html.erb~ +++ b/app/views/sites/index.html.erb~ @@ -1,29 +1,36 @@ -

Listing sites

+
+

Listing Sites

- - - - - - - - - - +
NameDescriptionTypeImage url
+ <% @sites.each do |site| %> + -<% @sites.each do |site| %> - - - - - - - - - + + + + + + + <% end %>
<%=site.name%><%=site.description%><%=site.type.name if site.type %><%=site.image_url %><%= link_to 'Show', site %><%= link_to 'Edit', edit_site_path(site) %><%= link_to 'Destroy', site, confirm: 'Are you sure?', method: :delete %>
+ <%= link_to image_tag(site.image_url, :class => 'list_image'), site %> + +
+
+ <%= link_to site.name, site %>
+
+ <%= truncate(strip_tags(site.description), :length => 80) %>
+
+
+ <%= 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 %>
+
+

+<%= link_to 'New site', new_site_path %> -
- -<%= link_to 'New Site', new_site_path %> diff --git a/app/views/sites/show.html.erb b/app/views/sites/show.html.erb index 8f8369a..8268b0a 100644 --- a/app/views/sites/show.html.erb +++ b/app/views/sites/show.html.erb @@ -6,8 +6,16 @@

<%= @site.name %>

<%=sanitize @site.description %>

+ +

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

+ + +

-<%= link_to 'Edit', edit_site_path(@site) %> | -<%= link_to 'Back', sites_path %> +<% if @site.user == current_user %> + <%= link_to 'Edit', edit_site_path(@site) %> | +<% end %> +<%= link_to 'Back', sites_path %> + diff --git a/app/views/sites/show.html.erb~ b/app/views/sites/show.html.erb~ index c5f0134..8f8369a 100644 --- a/app/views/sites/show.html.erb~ +++ b/app/views/sites/show.html.erb~ @@ -4,7 +4,7 @@

<%= @site.type.name if @site.type %>

<%= image_tag(@site.image_url, :class => 'site_image') %>

<%= @site.name %>

- +

<%=sanitize @site.description %>

From a6d506ea563ddb288a23247dc82cbcba56c01d25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Wed, 11 Apr 2012 18:00:35 +0200 Subject: [PATCH 18/56] scaffold trip --- app/controllers/trips_controller.rb | 83 +++++++++++++++++++++++ app/helpers/trips_helper.rb | 2 + app/models/trip.rb | 2 + app/views/trips/_form.html.erb | 17 +++++ app/views/trips/edit.html.erb | 6 ++ app/views/trips/index.html.erb | 21 ++++++ app/views/trips/new.html.erb | 5 ++ app/views/trips/show.html.erb | 5 ++ config/routes.rb | 2 + db/migrate/20120411160020_create_trips.rb | 8 +++ test/fixtures/trips.yml | 11 +++ test/functional/trips_controller_test.rb | 49 +++++++++++++ test/unit/helpers/trips_helper_test.rb | 4 ++ test/unit/trip_test.rb | 7 ++ 14 files changed, 222 insertions(+) create mode 100644 app/controllers/trips_controller.rb create mode 100644 app/helpers/trips_helper.rb create mode 100644 app/models/trip.rb create mode 100644 app/views/trips/_form.html.erb create mode 100644 app/views/trips/edit.html.erb create mode 100644 app/views/trips/index.html.erb create mode 100644 app/views/trips/new.html.erb create mode 100644 app/views/trips/show.html.erb create mode 100644 db/migrate/20120411160020_create_trips.rb create mode 100644 test/fixtures/trips.yml create mode 100644 test/functional/trips_controller_test.rb create mode 100644 test/unit/helpers/trips_helper_test.rb create mode 100644 test/unit/trip_test.rb diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb new file mode 100644 index 0000000..c776169 --- /dev/null +++ b/app/controllers/trips_controller.rb @@ -0,0 +1,83 @@ +class TripsController < ApplicationController + # GET /trips + # GET /trips.json + def index + @trips = Trip.all + + respond_to do |format| + format.html # index.html.erb + format.json { render json: @trips } + end + end + + # GET /trips/1 + # GET /trips/1.json + def show + @trip = Trip.find(params[:id]) + + respond_to do |format| + format.html # show.html.erb + format.json { render json: @trip } + end + end + + # GET /trips/new + # GET /trips/new.json + def new + @trip = Trip.new + + respond_to do |format| + format.html # new.html.erb + format.json { render json: @trip } + end + end + + # GET /trips/1/edit + def edit + @trip = Trip.find(params[:id]) + end + + # POST /trips + # POST /trips.json + def create + @trip = Trip.new(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 + + # PUT /trips/1 + # PUT /trips/1.json + def update + @trip = Trip.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 + + # DELETE /trips/1 + # DELETE /trips/1.json + def destroy + @trip = Trip.find(params[:id]) + @trip.destroy + + respond_to do |format| + format.html { redirect_to trips_url } + format.json { head :no_content } + end + end +end diff --git a/app/helpers/trips_helper.rb b/app/helpers/trips_helper.rb new file mode 100644 index 0000000..04f333d --- /dev/null +++ b/app/helpers/trips_helper.rb @@ -0,0 +1,2 @@ +module TripsHelper +end diff --git a/app/models/trip.rb b/app/models/trip.rb new file mode 100644 index 0000000..d079af4 --- /dev/null +++ b/app/models/trip.rb @@ -0,0 +1,2 @@ +class Trip < ActiveRecord::Base +end diff --git a/app/views/trips/_form.html.erb b/app/views/trips/_form.html.erb new file mode 100644 index 0000000..3413fb2 --- /dev/null +++ b/app/views/trips/_form.html.erb @@ -0,0 +1,17 @@ +<%= form_for(@trip) do |f| %> + <% if @trip.errors.any? %> +

+

<%= pluralize(@trip.errors.count, "error") %> prohibited this trip from being saved:

+ +
    + <% @trip.errors.full_messages.each do |msg| %> +
  • <%= msg %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= f.submit %> +
+<% end %> diff --git a/app/views/trips/edit.html.erb b/app/views/trips/edit.html.erb new file mode 100644 index 0000000..71287a4 --- /dev/null +++ b/app/views/trips/edit.html.erb @@ -0,0 +1,6 @@ +

Editing trip

+ +<%= render 'form' %> + +<%= link_to 'Show', @trip %> | +<%= link_to 'Back', trips_path %> diff --git a/app/views/trips/index.html.erb b/app/views/trips/index.html.erb new file mode 100644 index 0000000..f6bffa1 --- /dev/null +++ b/app/views/trips/index.html.erb @@ -0,0 +1,21 @@ +

Listing trips

+ + + + + + + + +<% @trips.each do |trip| %> + + + + + +<% end %> +
<%= link_to 'Show', trip %><%= link_to 'Edit', edit_trip_path(trip) %><%= link_to 'Destroy', trip, confirm: 'Are you sure?', method: :delete %>
+ +
+ +<%= link_to 'New Trip', new_trip_path %> diff --git a/app/views/trips/new.html.erb b/app/views/trips/new.html.erb new file mode 100644 index 0000000..dd3e49d --- /dev/null +++ b/app/views/trips/new.html.erb @@ -0,0 +1,5 @@ +

New trip

+ +<%= render 'form' %> + +<%= link_to 'Back', trips_path %> diff --git a/app/views/trips/show.html.erb b/app/views/trips/show.html.erb new file mode 100644 index 0000000..6a6f60a --- /dev/null +++ b/app/views/trips/show.html.erb @@ -0,0 +1,5 @@ +

<%= notice %>

+ + +<%= link_to 'Edit', edit_trip_path(@trip) %> | +<%= link_to 'Back', trips_path %> diff --git a/config/routes.rb b/config/routes.rb index 6864e22..864b38e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,7 @@ Planet::Application.routes.draw do + resources :trips + devise_for :users resources :sites diff --git a/db/migrate/20120411160020_create_trips.rb b/db/migrate/20120411160020_create_trips.rb new file mode 100644 index 0000000..f3baad7 --- /dev/null +++ b/db/migrate/20120411160020_create_trips.rb @@ -0,0 +1,8 @@ +class CreateTrips < ActiveRecord::Migration + def change + create_table :trips do |t| + + t.timestamps + end + end +end diff --git a/test/fixtures/trips.yml b/test/fixtures/trips.yml new file mode 100644 index 0000000..c63aac0 --- /dev/null +++ b/test/fixtures/trips.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/functional/trips_controller_test.rb b/test/functional/trips_controller_test.rb new file mode 100644 index 0000000..b09dce2 --- /dev/null +++ b/test/functional/trips_controller_test.rb @@ -0,0 +1,49 @@ +require 'test_helper' + +class TripsControllerTest < ActionController::TestCase + setup do + @trip = trips(:one) + end + + test "should get index" do + get :index + assert_response :success + assert_not_nil assigns(:trips) + end + + test "should get new" do + get :new + assert_response :success + end + + test "should create trip" do + assert_difference('Trip.count') do + post :create, trip: @trip.attributes + end + + assert_redirected_to trip_path(assigns(:trip)) + end + + test "should show trip" do + get :show, id: @trip + assert_response :success + end + + test "should get edit" do + get :edit, id: @trip + assert_response :success + end + + test "should update trip" do + put :update, id: @trip, trip: @trip.attributes + assert_redirected_to trip_path(assigns(:trip)) + end + + test "should destroy trip" do + assert_difference('Trip.count', -1) do + delete :destroy, id: @trip + end + + assert_redirected_to trips_path + end +end diff --git a/test/unit/helpers/trips_helper_test.rb b/test/unit/helpers/trips_helper_test.rb new file mode 100644 index 0000000..dcfddff --- /dev/null +++ b/test/unit/helpers/trips_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class TripsHelperTest < ActionView::TestCase +end diff --git a/test/unit/trip_test.rb b/test/unit/trip_test.rb new file mode 100644 index 0000000..1ed8ca6 --- /dev/null +++ b/test/unit/trip_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class TripTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end From 33b971fb0099b48295d4ae485a8ac9f2d392c636 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Wed, 11 Apr 2012 18:00:59 +0200 Subject: [PATCH 19/56] =?UTF-8?q?migraci=C3=B3n=20trip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/schema.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/db/schema.rb b/db/schema.rb index 2510a38..b35680d 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 => 20120411151143) do +ActiveRecord::Schema.define(:version => 20120411160020) do create_table "sites", :force => true do |t| t.string "name" @@ -23,6 +23,11 @@ t.integer "user_id" end + create_table "trips", :force => true do |t| + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + create_table "types", :force => true do |t| t.string "name" t.text "description" From 676303580f316087f5f05759f025a5e9bf05f4da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Wed, 11 Apr 2012 18:47:02 +0200 Subject: [PATCH 20/56] =?UTF-8?q?mejorar=20vistas=20y=20a=C3=B1adir=20cled?= =?UTF-8?q?itor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 3 +- Gemfile.lock | 2 + Gemfile~ | 2 +- app/assets/javascripts/application.js | 1 + app/assets/javascripts/application.js~ | 15 ++++ app/assets/stylesheets/application.css | 1 + app/assets/stylesheets/application.css~ | 13 ++++ app/controllers/trips_controller.rb | 19 +++-- app/controllers/trips_controller.rb~ | 88 ++++++++++++++++++++++ app/models/trip.rb | 3 + app/models/trip.rb~ | 5 ++ app/models/user.rb | 6 +- app/models/user.rb~ | 3 +- app/views/layouts/application.html.erb | 6 ++ app/views/layouts/application.html.erb~ | 5 -- app/views/trips/_form.html.erb | 13 ++++ app/views/trips/_form.html.erb~ | 17 +++++ app/views/trips/index.html.erb | 47 +++++++----- app/views/trips/index.html.erb~ | 32 ++++++++ app/views/trips/show.html.erb | 46 ++++++++++- app/views/trips/show.html.erb~ | 5 ++ app/views/types/index.html.erb | 53 +++++++------ app/views/types/index.html.erb~ | 2 + app/views/types/ordered_index.html.erb | 51 +++++++------ app/views/types/ordered_index.html.erb~ | 2 +- db/migrate/20120411160020_create_trips.rb | 5 +- db/migrate/20120411160020_create_trips.rb~ | 8 ++ 27 files changed, 362 insertions(+), 91 deletions(-) create mode 100644 app/assets/javascripts/application.js~ create mode 100644 app/assets/stylesheets/application.css~ create mode 100644 app/controllers/trips_controller.rb~ create mode 100644 app/models/trip.rb~ create mode 100644 app/views/trips/_form.html.erb~ create mode 100644 app/views/trips/index.html.erb~ create mode 100644 app/views/trips/show.html.erb~ create mode 100644 db/migrate/20120411160020_create_trips.rb~ diff --git a/Gemfile b/Gemfile index 340ed9e..68f936d 100644 --- a/Gemfile +++ b/Gemfile @@ -8,6 +8,7 @@ gem 'rails', '3.2.2' gem 'sqlite3' gem 'devise' + # Gems used only for assets and not required # in production environments by default. group :assets do @@ -21,7 +22,7 @@ group :assets do end gem 'jquery-rails' - +gem 'cleditor_rails' # To use ActiveModel has_secure_password # gem 'bcrypt-ruby', '~> 3.0.0' diff --git a/Gemfile.lock b/Gemfile.lock index b16d2d9..36f623e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -31,6 +31,7 @@ GEM arel (3.0.2) bcrypt-ruby (3.0.1) builder (3.0.0) + cleditor_rails (0.0.3) coffee-rails (3.2.2) coffee-script (>= 2.2.0) railties (~> 3.2.0) @@ -112,6 +113,7 @@ PLATFORMS ruby DEPENDENCIES + cleditor_rails coffee-rails (~> 3.2.1) devise jquery-rails diff --git a/Gemfile~ b/Gemfile~ index 7764763..340ed9e 100644 --- a/Gemfile~ +++ b/Gemfile~ @@ -7,7 +7,7 @@ gem 'rails', '3.2.2' gem 'sqlite3' - +gem 'devise' # Gems used only for assets and not required # in production environments by default. group :assets do diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 9097d83..84d87a2 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -11,5 +11,6 @@ // GO AFTER THE REQUIRES BELOW. // //= require jquery +//= require cleditor //= require jquery_ujs //= require_tree . diff --git a/app/assets/javascripts/application.js~ b/app/assets/javascripts/application.js~ new file mode 100644 index 0000000..9097d83 --- /dev/null +++ b/app/assets/javascripts/application.js~ @@ -0,0 +1,15 @@ +// This is a manifest file that'll be compiled into application.js, which will include all the files +// listed below. +// +// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, +// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path. +// +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// the compiled file. +// +// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD +// GO AFTER THE REQUIRES BELOW. +// +//= require jquery +//= require jquery_ujs +//= require_tree . diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 3b5cc66..50d53e3 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -9,5 +9,6 @@ * compiled file, but it's generally better to create a new file per style scope. * *= require_self + *= require cleditor *= require_tree . */ diff --git a/app/assets/stylesheets/application.css~ b/app/assets/stylesheets/application.css~ new file mode 100644 index 0000000..3b5cc66 --- /dev/null +++ b/app/assets/stylesheets/application.css~ @@ -0,0 +1,13 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, + * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the top of the + * compiled file, but it's generally better to create a new file per style scope. + * + *= require_self + *= require_tree . +*/ diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index c776169..321f6e3 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -1,4 +1,8 @@ class TripsController < ApplicationController + + # authenticate_user! ejecuta acción solo si sesión existe + before_filter :authenticate_user!, :except => [ :index, :show ] + # GET /trips # GET /trips.json def index @@ -14,6 +18,7 @@ def index # GET /trips/1.json def show @trip = Trip.find(params[:id]) + @visit = @trip.visits.build respond_to do |format| format.html # show.html.erb @@ -24,8 +29,8 @@ def show # GET /trips/new # GET /trips/new.json def new - @trip = Trip.new - + @trip = current_user.trips.build + respond_to do |format| format.html # new.html.erb format.json { render json: @trip } @@ -34,13 +39,13 @@ def new # GET /trips/1/edit def edit - @trip = Trip.find(params[:id]) + @trip = current_user.trips.find(params[:id]) end # POST /trips # POST /trips.json def create - @trip = Trip.new(params[:trip]) + @trip = current_user.trips.build(params[:trip]) respond_to do |format| if @trip.save @@ -56,8 +61,8 @@ def create # PUT /trips/1 # PUT /trips/1.json def update - @trip = Trip.find(params[:id]) - + @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.' } @@ -72,7 +77,7 @@ def update # DELETE /trips/1 # DELETE /trips/1.json def destroy - @trip = Trip.find(params[:id]) + @trip = current_user.trips.find(params[:id]) @trip.destroy respond_to do |format| diff --git a/app/controllers/trips_controller.rb~ b/app/controllers/trips_controller.rb~ new file mode 100644 index 0000000..321f6e3 --- /dev/null +++ b/app/controllers/trips_controller.rb~ @@ -0,0 +1,88 @@ +class TripsController < ApplicationController + + # authenticate_user! ejecuta acción solo si sesión existe + before_filter :authenticate_user!, :except => [ :index, :show ] + + # GET /trips + # GET /trips.json + def index + @trips = Trip.all + + respond_to do |format| + format.html # index.html.erb + format.json { render json: @trips } + end + end + + # GET /trips/1 + # GET /trips/1.json + 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 + + # GET /trips/new + # GET /trips/new.json + def new + @trip = current_user.trips.build + + respond_to do |format| + format.html # new.html.erb + format.json { render json: @trip } + end + end + + # GET /trips/1/edit + def edit + @trip = current_user.trips.find(params[:id]) + end + + # POST /trips + # POST /trips.json + 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 + + # PUT /trips/1 + # PUT /trips/1.json + 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 + + # DELETE /trips/1 + # DELETE /trips/1.json + 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 +end diff --git a/app/models/trip.rb b/app/models/trip.rb index d079af4..3e66018 100644 --- a/app/models/trip.rb +++ b/app/models/trip.rb @@ -1,2 +1,5 @@ class Trip < ActiveRecord::Base + belongs_to :user + + attr_protected :user_id end diff --git a/app/models/trip.rb~ b/app/models/trip.rb~ new file mode 100644 index 0000000..1595d16 --- /dev/null +++ b/app/models/trip.rb~ @@ -0,0 +1,5 @@ +class Trip < ActiveRecord::Base + belongs_to :user + + +end diff --git a/app/models/user.rb b/app/models/user.rb index 04f781c..8ca1613 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,10 +1,14 @@ class User < ActiveRecord::Base + + has_many :sites + has_many :trips + # Include default devise modules. Others available are: # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable - has_many :sites + # Setup accessible (or protected) attributes for your model attr_accessible :name, :email, :password, :password_confirmation, :remember_me diff --git a/app/models/user.rb~ b/app/models/user.rb~ index c24ce2c..e85c594 100644 --- a/app/models/user.rb~ +++ b/app/models/user.rb~ @@ -5,7 +5,8 @@ class User < ActiveRecord::Base :recoverable, :rememberable, :trackable, :validatable has_many :sites + has_many :trips # Setup accessible (or protected) attributes for your model - attr_accessible :email, :password, :password_confirmation, :remember_me + attr_accessible :name, :email, :password, :password_confirmation, :remember_me end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 4a19a9d..5b1ae12 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -6,6 +6,11 @@ <%= javascript_include_tag "application" %> <%= csrf_meta_tags %> + @@ -29,6 +34,7 @@ <%= link_to "Tipos", types_path %>
<%= link_to "Tipos ordenados", ordered_index_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 if !current_user %> diff --git a/app/views/layouts/application.html.erb~ b/app/views/layouts/application.html.erb~ index 5b1ae12..8e4ecaf 100644 --- a/app/views/layouts/application.html.erb~ +++ b/app/views/layouts/application.html.erb~ @@ -6,11 +6,6 @@ <%= javascript_include_tag "application" %> <%= csrf_meta_tags %> - diff --git a/app/views/trips/_form.html.erb b/app/views/trips/_form.html.erb index 3413fb2..fa8cb2f 100644 --- a/app/views/trips/_form.html.erb +++ b/app/views/trips/_form.html.erb @@ -11,6 +11,19 @@ <% end %> +
+ <%= f.label :name %>
+ <%= f.text_field :name %> +
+
+ <%= f.label :description %>
+ <%= f.text_area :description %> +
+
+ <%= f.label :date %>
+ <%= f.date_select :date %> +
+
<%= f.submit %>
diff --git a/app/views/trips/_form.html.erb~ b/app/views/trips/_form.html.erb~ new file mode 100644 index 0000000..3413fb2 --- /dev/null +++ b/app/views/trips/_form.html.erb~ @@ -0,0 +1,17 @@ +<%= form_for(@trip) do |f| %> + <% if @trip.errors.any? %> +
+

<%= pluralize(@trip.errors.count, "error") %> prohibited this trip from being saved:

+ +
    + <% @trip.errors.full_messages.each do |msg| %> +
  • <%= msg %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= f.submit %> +
+<% end %> diff --git a/app/views/trips/index.html.erb b/app/views/trips/index.html.erb index f6bffa1..86fbbf0 100644 --- a/app/views/trips/index.html.erb +++ b/app/views/trips/index.html.erb @@ -1,21 +1,30 @@ -

Listing trips

- - - - - - - - -<% @trips.each do |trip| %> - - - - - -<% end %> -
<%= link_to 'Show', trip %><%= link_to 'Edit', edit_trip_path(trip) %><%= link_to 'Destroy', trip, confirm: 'Are you sure?', method: :delete %>
- -
+
+

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 %> diff --git a/app/views/trips/index.html.erb~ b/app/views/trips/index.html.erb~ new file mode 100644 index 0000000..9f0f64c --- /dev/null +++ b/app/views/trips/index.html.erb~ @@ -0,0 +1,32 @@ +
+

Viajes

+ + + <% @trips.each do |trip| %> + + + + + + + <% end %> +
+
+
<%= link_to trip.name, trip_path(type) %>
+
<%= truncate(strip_tags(trip.description), + :length => 80)+', '+trip.date.to_s %>
+
+
+ <%= link_to 'Show', trip %>
+ <%= if site.user == current_user %>
+ <%= link_to 'Edit', edit_trip_path(trip) %>
+ <%= link_to 'Destroy', trip, + :confirm => 'Are you sure?', + :method => :delete %> + <%= end %>
+
+
+ +
+ +<%= link_to 'New Type', new_type_path %> diff --git a/app/views/trips/show.html.erb b/app/views/trips/show.html.erb index 6a6f60a..8948449 100644 --- a/app/views/trips/show.html.erb +++ b/app/views/trips/show.html.erb @@ -1,5 +1,47 @@ -

<%= notice %>

+

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

+

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

-<%= link_to 'Edit', edit_trip_path(@trip) %> | +

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

+ +

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

+ +
+ +

Sitios a visitar

+ + <%= render(@trip) %> + + <% if @trip.user == current_user %> + <%= form_for(@visit) do |f| %> + + <%= f.number_field :trip_id, :value => @trip.id, :hidden => true %> + <%= f.collection_select(:site_id, + Site.all, + :id, + :name) %> + <%= f.select(:hour, Array.new(24, 0).fill {|i| [(i.to_s + 'H'), i]}) %> + <%= f.submit "Añadir sitio" %> + <% end %> + <% end %> +
+ +
+ + +<% if @trip.user == current_user %> + <%= link_to 'Edit', edit_trip_path(@trip) %> | +<% end %> <%= link_to 'Back', trips_path %> diff --git a/app/views/trips/show.html.erb~ b/app/views/trips/show.html.erb~ new file mode 100644 index 0000000..6a6f60a --- /dev/null +++ b/app/views/trips/show.html.erb~ @@ -0,0 +1,5 @@ +

<%= notice %>

+ + +<%= link_to 'Edit', edit_trip_path(@trip) %> | +<%= link_to 'Back', trips_path %> diff --git a/app/views/types/index.html.erb b/app/views/types/index.html.erb index aa159be..e761359 100644 --- a/app/views/types/index.html.erb +++ b/app/views/types/index.html.erb @@ -1,31 +1,30 @@ -

Listing types

- - - - - - - - - - - -<% @types.each do |type| %> - - - - - - - - -<% end %> -
NameDescriptionÚltima actualización
<%= link_to type.name, type_sites_path(type) %><%= type.description %><%= type.updated_at %><%= link_to 'Show', type %><%= link_to 'Edit', edit_type_path(type) %><%= link_to 'Destroy', type, confirm: 'Are you sure?', method: :delete %>
+
+

Listing Types

+ + + <% @types.each do |type| %> + + + + + + + <% end %> +
+
+
<%= link_to type.name, type_sites_path(type) %>
+
<%= truncate(strip_tags(type.description), + :length => 80) %>
+
+
+ <%= 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 %> - -
- - diff --git a/app/views/types/index.html.erb~ b/app/views/types/index.html.erb~ index 597f012..aa159be 100644 --- a/app/views/types/index.html.erb~ +++ b/app/views/types/index.html.erb~ @@ -27,3 +27,5 @@ <%= link_to 'New Type', new_type_path %>
+ + diff --git a/app/views/types/ordered_index.html.erb b/app/views/types/ordered_index.html.erb index 3741544..e761359 100644 --- a/app/views/types/ordered_index.html.erb +++ b/app/views/types/ordered_index.html.erb @@ -1,29 +1,30 @@ -

Listing types

- - - - - - - - - - - -<% @types.each do |type| %> - - - - - - - - -<% end %> -
NameDescriptionÚltima actualización
<%= link_to type.name,type_sites_path(type.id) %><%= type.description %><%= type.updated_at %><%= link_to 'Show', type %><%= link_to 'Edit', edit_type_path(type) %><%= link_to 'Destroy', type, confirm: 'Are you sure?', method: :delete %>
+
+

Listing Types

+ + + <% @types.each do |type| %> + + + + + + + <% end %> +
+
+
<%= link_to type.name, type_sites_path(type) %>
+
<%= truncate(strip_tags(type.description), + :length => 80) %>
+
+
+ <%= 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 %> - -
diff --git a/app/views/types/ordered_index.html.erb~ b/app/views/types/ordered_index.html.erb~ index 25e055b..3741544 100644 --- a/app/views/types/ordered_index.html.erb~ +++ b/app/views/types/ordered_index.html.erb~ @@ -12,7 +12,7 @@ <% @types.each do |type| %> - <%= type.name %> + <%= link_to type.name,type_sites_path(type.id) %> <%= type.description %> <%= type.updated_at %> <%= link_to 'Show', type %> diff --git a/db/migrate/20120411160020_create_trips.rb b/db/migrate/20120411160020_create_trips.rb index f3baad7..a8f57d3 100644 --- a/db/migrate/20120411160020_create_trips.rb +++ b/db/migrate/20120411160020_create_trips.rb @@ -1,7 +1,10 @@ class CreateTrips < ActiveRecord::Migration def change create_table :trips do |t| - + t.string :name + t.text :description + t.date :date + t.integer :user_id t.timestamps end end diff --git a/db/migrate/20120411160020_create_trips.rb~ b/db/migrate/20120411160020_create_trips.rb~ new file mode 100644 index 0000000..f3baad7 --- /dev/null +++ b/db/migrate/20120411160020_create_trips.rb~ @@ -0,0 +1,8 @@ +class CreateTrips < ActiveRecord::Migration + def change + create_table :trips do |t| + + t.timestamps + end + end +end From 6963793441620702ac3a66c4d411d17d16be63b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Wed, 11 Apr 2012 19:03:50 +0200 Subject: [PATCH 21/56] =?UTF-8?q?nueva=20migraci=C3=B3n=20trips?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/migrate/20120411160020_create_trips.rb~ | 5 ++++- db/schema.rb | 8 ++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/db/migrate/20120411160020_create_trips.rb~ b/db/migrate/20120411160020_create_trips.rb~ index f3baad7..a8f57d3 100644 --- a/db/migrate/20120411160020_create_trips.rb~ +++ b/db/migrate/20120411160020_create_trips.rb~ @@ -1,7 +1,10 @@ class CreateTrips < ActiveRecord::Migration def change create_table :trips do |t| - + t.string :name + t.text :description + t.date :date + t.integer :user_id t.timestamps end end diff --git a/db/schema.rb b/db/schema.rb index b35680d..c517ef4 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -24,8 +24,12 @@ end create_table "trips", :force => true do |t| - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.string "name" + t.text "description" + t.date "date" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false end create_table "types", :force => true do |t| From 01668a23df6f8e07de4fc3f197ffcd327c85ce3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Wed, 11 Apr 2012 19:12:57 +0200 Subject: [PATCH 22/56] corregir vistas --- app/controllers/trips_controller.rb | 1 - app/views/trips/show.html.erb | 49 +++++++---------------------- app/views/trips/show.html.erb~ | 37 ++++++++++++++++++++-- 3 files changed, 47 insertions(+), 40 deletions(-) diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index 321f6e3..48a193d 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -18,7 +18,6 @@ def index # GET /trips/1.json def show @trip = Trip.find(params[:id]) - @visit = @trip.visits.build respond_to do |format| format.html # show.html.erb diff --git a/app/views/trips/show.html.erb b/app/views/trips/show.html.erb index 8948449..6967bde 100644 --- a/app/views/trips/show.html.erb +++ b/app/views/trips/show.html.erb @@ -1,47 +1,22 @@

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

- -

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

-

- Autor: - <%= @trip.user.name if @trip.user %> +Description: +<%= simple_format @trip.description %>

-

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

+

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

+<% if @trip.user == current_user %> +<%= link_to 'Edit', edit_trip_path(@trip) %> | +<% end %> +<%= link_to 'Back', trips_path %> -
- -

Sitios a visitar

- - <%= render(@trip) %> - - <% if @trip.user == current_user %> - <%= form_for(@visit) do |f| %> - - <%= f.number_field :trip_id, :value => @trip.id, :hidden => true %> - <%= f.collection_select(:site_id, - Site.all, - :id, - :name) %> - <%= f.select(:hour, Array.new(24, 0).fill {|i| [(i.to_s + 'H'), i]}) %> - <%= f.submit "Añadir sitio" %> - <% end %> - <% end %> -
-
-<% if @trip.user == current_user %> - <%= link_to 'Edit', edit_trip_path(@trip) %> | -<% end %> -<%= link_to 'Back', trips_path %> diff --git a/app/views/trips/show.html.erb~ b/app/views/trips/show.html.erb~ index 6a6f60a..02d61a7 100644 --- a/app/views/trips/show.html.erb~ +++ b/app/views/trips/show.html.erb~ @@ -1,5 +1,38 @@ -

<%= notice %>

+

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

+

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

-<%= link_to 'Edit', edit_trip_path(@trip) %> | +

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

+ +

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

+ +
+ +

Sitios a visitar

+ + <%= render(@trip) %> + + <% if @trip.user == current_user %> + + <% end %> +
+ +
+ + +<% if @trip.user == current_user %> + <%= link_to 'Edit', edit_trip_path(@trip) %> | +<% end %> <%= link_to 'Back', trips_path %> From 484834654e905183a37f0f84dec5f15a42e086a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Fri, 13 Apr 2012 20:21:52 +0200 Subject: [PATCH 23/56] =?UTF-8?q?Creaci=C3=B3n=20scaffold=20comment=20y=20?= =?UTF-8?q?migraci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/javascripts/comments.js.coffee | 3 + app/assets/stylesheets/comments.css.scss | 3 + app/controllers/comments_controller.rb | 83 +++++++++++++++++++ app/helpers/comments_helper.rb | 2 + app/models/comment.rb | 2 + app/views/comments/_form.html.erb | 17 ++++ app/views/comments/edit.html.erb | 6 ++ app/views/comments/index.html.erb | 21 +++++ app/views/comments/new.html.erb | 5 ++ app/views/comments/show.html.erb | 5 ++ config/routes.rb | 2 + db/migrate/20120413181754_create_comments.rb | 10 +++ db/migrate/20120413181754_create_comments.rb~ | 8 ++ db/schema.rb | 10 ++- test/fixtures/comments.yml | 11 +++ test/functional/comments_controller_test.rb | 49 +++++++++++ test/unit/comment_test.rb | 7 ++ test/unit/helpers/comments_helper_test.rb | 4 + 18 files changed, 247 insertions(+), 1 deletion(-) 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/models/comment.rb create mode 100644 app/views/comments/_form.html.erb create mode 100644 app/views/comments/edit.html.erb 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/migrate/20120413181754_create_comments.rb create mode 100644 db/migrate/20120413181754_create_comments.rb~ create mode 100644 test/fixtures/comments.yml create mode 100644 test/functional/comments_controller_test.rb create mode 100644 test/unit/comment_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..3722c12 --- /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..dfb5f63 --- /dev/null +++ b/app/controllers/comments_controller.rb @@ -0,0 +1,83 @@ +class CommentsController < ApplicationController + # GET /comments + # GET /comments.json + def index + @comments = Comment.all + + respond_to do |format| + format.html # index.html.erb + format.json { render json: @comments } + end + end + + # GET /comments/1 + # GET /comments/1.json + def show + @comment = Comment.find(params[:id]) + + respond_to do |format| + format.html # show.html.erb + format.json { render json: @comment } + end + end + + # GET /comments/new + # GET /comments/new.json + def new + @comment = Comment.new + + respond_to do |format| + format.html # new.html.erb + format.json { render json: @comment } + end + end + + # GET /comments/1/edit + def edit + @comment = Comment.find(params[:id]) + end + + # POST /comments + # POST /comments.json + def create + @comment = Comment.new(params[:comment]) + + respond_to do |format| + if @comment.save + format.html { redirect_to @comment, notice: 'Comment was successfully created.' } + format.json { render json: @comment, status: :created, location: @comment } + else + format.html { render action: "new" } + format.json { render json: @comment.errors, status: :unprocessable_entity } + end + end + end + + # PUT /comments/1 + # PUT /comments/1.json + def update + @comment = Comment.find(params[:id]) + + respond_to do |format| + if @comment.update_attributes(params[:comment]) + format.html { redirect_to @comment, notice: 'Comment was successfully updated.' } + format.json { head :no_content } + else + format.html { render action: "edit" } + format.json { render json: @comment.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /comments/1 + # DELETE /comments/1.json + def destroy + @comment = Comment.find(params[:id]) + @comment.destroy + + respond_to do |format| + format.html { redirect_to comments_url } + format.json { head :no_content } + end + end +end 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 new file mode 100644 index 0000000..45b2d38 --- /dev/null +++ b/app/models/comment.rb @@ -0,0 +1,2 @@ +class Comment < ActiveRecord::Base +end diff --git a/app/views/comments/_form.html.erb b/app/views/comments/_form.html.erb new file mode 100644 index 0000000..a568b0b --- /dev/null +++ b/app/views/comments/_form.html.erb @@ -0,0 +1,17 @@ +<%= form_for(@comment) do |f| %> + <% if @comment.errors.any? %> +
+

<%= pluralize(@comment.errors.count, "error") %> prohibited this comment from being saved:

+ +
    + <% @comment.errors.full_messages.each do |msg| %> +
  • <%= msg %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= f.submit %> +
+<% end %> diff --git a/app/views/comments/edit.html.erb b/app/views/comments/edit.html.erb new file mode 100644 index 0000000..12ea7f9 --- /dev/null +++ b/app/views/comments/edit.html.erb @@ -0,0 +1,6 @@ +

Editing comment

+ +<%= render 'form' %> + +<%= link_to 'Show', @comment %> | +<%= link_to 'Back', comments_path %> diff --git a/app/views/comments/index.html.erb b/app/views/comments/index.html.erb new file mode 100644 index 0000000..3b83e1c --- /dev/null +++ b/app/views/comments/index.html.erb @@ -0,0 +1,21 @@ +

Listing comments

+ + + + + + + + +<% @comments.each do |comment| %> + + + + + +<% end %> +
<%= link_to 'Show', comment %><%= link_to 'Edit', edit_comment_path(comment) %><%= link_to 'Destroy', comment, confirm: 'Are you sure?', method: :delete %>
+ +
+ +<%= link_to 'New Comment', new_comment_path %> diff --git a/app/views/comments/new.html.erb b/app/views/comments/new.html.erb new file mode 100644 index 0000000..07a754a --- /dev/null +++ b/app/views/comments/new.html.erb @@ -0,0 +1,5 @@ +

New comment

+ +<%= render 'form' %> + +<%= link_to 'Back', comments_path %> diff --git a/app/views/comments/show.html.erb b/app/views/comments/show.html.erb new file mode 100644 index 0000000..d5e89c7 --- /dev/null +++ b/app/views/comments/show.html.erb @@ -0,0 +1,5 @@ +

<%= notice %>

+ + +<%= link_to 'Edit', edit_comment_path(@comment) %> | +<%= link_to 'Back', comments_path %> diff --git a/config/routes.rb b/config/routes.rb index 864b38e..4ac75d1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,7 @@ Planet::Application.routes.draw do + resources :comments + resources :trips devise_for :users diff --git a/db/migrate/20120413181754_create_comments.rb b/db/migrate/20120413181754_create_comments.rb new file mode 100644 index 0000000..dd5c10a --- /dev/null +++ b/db/migrate/20120413181754_create_comments.rb @@ -0,0 +1,10 @@ +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/migrate/20120413181754_create_comments.rb~ b/db/migrate/20120413181754_create_comments.rb~ new file mode 100644 index 0000000..7693f7d --- /dev/null +++ b/db/migrate/20120413181754_create_comments.rb~ @@ -0,0 +1,8 @@ +class CreateComments < ActiveRecord::Migration + def change + create_table :comments do |t| + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index c517ef4..e8b7476 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 => 20120411160020) do +ActiveRecord::Schema.define(:version => 20120413181754) 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..c63aac0 --- /dev/null +++ b/test/fixtures/comments.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/functional/comments_controller_test.rb b/test/functional/comments_controller_test.rb new file mode 100644 index 0000000..b2b500c --- /dev/null +++ b/test/functional/comments_controller_test.rb @@ -0,0 +1,49 @@ +require 'test_helper' + +class CommentsControllerTest < ActionController::TestCase + setup do + @comment = comments(:one) + 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_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)) + end + + test "should destroy comment" do + assert_difference('Comment.count', -1) do + delete :destroy, id: @comment + end + + assert_redirected_to comments_path + end +end 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 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 32ad3776edb0640fab35b843466559395448782c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Fri, 13 Apr 2012 20:33:59 +0200 Subject: [PATCH 24/56] =?UTF-8?q?Mejora=20de=20vistas=20para=20a=C3=B1adir?= =?UTF-8?q?=20comentarios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/comments_controller.rb | 23 +++---- app/controllers/comments_controller.rb~ | 81 +++++++++++++++++++++++++ app/models/comment.rb | 5 ++ app/models/comment.rb~ | 2 + app/models/site.rb | 1 + app/models/site.rb~ | 6 +- app/models/user.rb | 2 + app/models/user.rb~ | 7 ++- app/views/comments/_comment.html.erb | 3 + app/views/comments/_form.html.erb | 19 ++---- app/views/sites/show.html.erb | 6 ++ app/views/sites/show.html.erb~ | 20 +++++- config/routes.rb | 5 +- config/routes.rb~ | 23 ++++--- 14 files changed, 158 insertions(+), 45 deletions(-) create mode 100644 app/controllers/comments_controller.rb~ create mode 100644 app/models/comment.rb~ create mode 100644 app/views/comments/_comment.html.erb diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index dfb5f63..9e81878 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -40,17 +40,10 @@ def edit # POST /comments # POST /comments.json def create - @comment = Comment.new(params[:comment]) + @site = Site.find(params[:site_id]) + @coment = @site.comments.create(params[:comment]) - respond_to do |format| - if @comment.save - format.html { redirect_to @comment, notice: 'Comment was successfully created.' } - format.json { render json: @comment, status: :created, location: @comment } - else - format.html { render action: "new" } - format.json { render json: @comment.errors, status: :unprocessable_entity } - end - end + redirect_to site_path(@site) end # PUT /comments/1 @@ -72,12 +65,10 @@ def update # DELETE /comments/1 # DELETE /comments/1.json def destroy - @comment = Comment.find(params[:id]) - @comment.destroy + @site = Site.find(params[:site_id]) + @coment = @site.comments.find(params[:id]) + @coment.destroy - respond_to do |format| - format.html { redirect_to comments_url } - format.json { head :no_content } - end + redirect_to site_path(@site) end end diff --git a/app/controllers/comments_controller.rb~ b/app/controllers/comments_controller.rb~ new file mode 100644 index 0000000..da5f13f --- /dev/null +++ b/app/controllers/comments_controller.rb~ @@ -0,0 +1,81 @@ +class CommentsController < ApplicationController + # GET /comments + # GET /comments.json + def index + @comments = Comment.all + + respond_to do |format| + format.html # index.html.erb + format.json { render json: @comments } + end + end + + # GET /comments/1 + # GET /comments/1.json + def show + @comment = Comment.find(params[:id]) + + respond_to do |format| + format.html # show.html.erb + format.json { render json: @comment } + end + end + + # GET /comments/new + # GET /comments/new.json + def new + @comment = Comment.new + + respond_to do |format| + format.html # new.html.erb + format.json { render json: @comment } + end + end + + # GET /comments/1/edit + def edit + @comment = Comment.find(params[:id]) + end + + # POST /comments + # POST /comments.json + def create + @comment = Comment.new(params[:comment]) + + respond_to do |format| + if @comment.save + format.html { redirect_to @comment, notice: 'Comment was successfully created.' } + format.json { render json: @comment, status: :created, location: @comment } + else + format.html { render action: "new" } + format.json { render json: @comment.errors, status: :unprocessable_entity } + end + end + end + + # PUT /comments/1 + # PUT /comments/1.json + def update + @comment = Comment.find(params[:id]) + + respond_to do |format| + if @comment.update_attributes(params[:comment]) + format.html { redirect_to @comment, notice: 'Comment was successfully updated.' } + format.json { head :no_content } + else + format.html { render action: "edit" } + format.json { render json: @comment.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /comments/1 + # DELETE /comments/1.json + def destroy + @site = Site.find(params[:site_id]) + @coment = @site.comments.find(params[:id]) + @coment.destroy + + redirect_to site_path(@site) + end +end diff --git a/app/models/comment.rb b/app/models/comment.rb index 45b2d38..e16f5ae 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -1,2 +1,7 @@ class Comment < ActiveRecord::Base + + belongs_to :user + belongs_to :site + + attr_protected :user_id end diff --git a/app/models/comment.rb~ b/app/models/comment.rb~ new file mode 100644 index 0000000..45b2d38 --- /dev/null +++ b/app/models/comment.rb~ @@ -0,0 +1,2 @@ +class Comment < ActiveRecord::Base +end diff --git a/app/models/site.rb b/app/models/site.rb index 8caad4e..fabaf7f 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -2,6 +2,7 @@ class Site < ActiveRecord::Base belongs_to :type belongs_to :user + has_many :comments #Debe estar protegido para evitar accesos indeseados attr_protected :user_id diff --git a/app/models/site.rb~ b/app/models/site.rb~ index 76f9765..8caad4e 100644 --- a/app/models/site.rb~ +++ b/app/models/site.rb~ @@ -2,12 +2,14 @@ class Site < ActiveRecord::Base belongs_to :type belongs_to :user + + #Debe estar protegido para evitar accesos indeseados + attr_protected :user_id + # Se añaden estas definiciones validates :name, :type_id, :image_url, :presence => true # campo obligatorio - #Debe estar protegido para evitar accesos indeseados - attr_protected :user_id end diff --git a/app/models/user.rb b/app/models/user.rb index 8ca1613..80150f6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -3,6 +3,8 @@ class User < ActiveRecord::Base has_many :sites has_many :trips + 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/models/user.rb~ b/app/models/user.rb~ index e85c594..8ca1613 100644 --- a/app/models/user.rb~ +++ b/app/models/user.rb~ @@ -1,11 +1,14 @@ class User < ActiveRecord::Base + + has_many :sites + has_many :trips + # Include default devise modules. Others available are: # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable - has_many :sites - has_many :trips + # Setup accessible (or protected) attributes for your model attr_accessible :name, :email, :password, :password_confirmation, :remember_me diff --git a/app/views/comments/_comment.html.erb b/app/views/comments/_comment.html.erb new file mode 100644 index 0000000..3cd335f --- /dev/null +++ b/app/views/comments/_comment.html.erb @@ -0,0 +1,3 @@ +

+ <%= comment.coment %> +

diff --git a/app/views/comments/_form.html.erb b/app/views/comments/_form.html.erb index a568b0b..dc33f8d 100644 --- a/app/views/comments/_form.html.erb +++ b/app/views/comments/_form.html.erb @@ -1,16 +1,9 @@ -<%= form_for(@comment) do |f| %> - <% if @comment.errors.any? %> -
-

<%= pluralize(@comment.errors.count, "error") %> prohibited this comment from being saved:

- -
    - <% @comment.errors.full_messages.each do |msg| %> -
  • <%= msg %>
  • - <% end %> -
-
- <% end %> - +<%= form_for([@site, @site.comments.build]) do |f| %> +
+ <%= f.label :coment %>
+ <%= f.text_area :coment %> +
+
<%= f.submit %>
diff --git a/app/views/sites/show.html.erb b/app/views/sites/show.html.erb index 8268b0a..c7dff44 100644 --- a/app/views/sites/show.html.erb +++ b/app/views/sites/show.html.erb @@ -12,6 +12,12 @@ +Comentarios + <%= render @site.comments %> + +Añada su comentario: + <%= render "comments/form" %> +

<% if @site.user == current_user %> <%= link_to 'Edit', edit_site_path(@site) %> | diff --git a/app/views/sites/show.html.erb~ b/app/views/sites/show.html.erb~ index 8f8369a..c7dff44 100644 --- a/app/views/sites/show.html.erb~ +++ b/app/views/sites/show.html.erb~ @@ -6,8 +6,22 @@

<%= @site.name %>

<%=sanitize @site.description %>

+ +

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

+ + + +Comentarios + <%= render @site.comments %> + +Añada su comentario: + <%= render "comments/form" %> +

-<%= link_to 'Edit', edit_site_path(@site) %> | -<%= link_to 'Back', sites_path %> +<% if @site.user == current_user %> + <%= link_to 'Edit', edit_site_path(@site) %> | +<% end %> +<%= link_to 'Back', sites_path %> + diff --git a/config/routes.rb b/config/routes.rb index 4ac75d1..8c30bc5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,12 +1,13 @@ Planet::Application.routes.draw do - resources :comments resources :trips devise_for :users - resources :sites + resources :sites do + resources :comments + end resources :types do # Rutas anidadas /types/id/sites..., resources :sites, :only => [ :index ] # Restringe a acción “index” diff --git a/config/routes.rb~ b/config/routes.rb~ index f476920..4ac75d1 100644 --- a/config/routes.rb~ +++ b/config/routes.rb~ @@ -1,18 +1,27 @@ Planet::Application.routes.draw do + resources :comments + + resources :trips + + devise_for :users + resources :sites - resources :types do - get 'ordered_index', :on => :collection - end + resources :types do # Rutas anidadas /types/id/sites..., + resources :sites, :only => [ :index ] # Restringe a acción “index” + + get 'ordered_index', :on => :collection + end + + get "planet/index" - get "planet/index" + get "planet/contact" - get "planet/contact" + get "planet/ejemplo" - get "planet/ejemplo" + get "planet/author" - get "planet/author" # The priority is based upon order of creation: # first created -> highest priority. From 5de9dd80f39734630f7d569c21e931822b5bf153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Fri, 13 Apr 2012 20:45:06 +0200 Subject: [PATCH 25/56] =?UTF-8?q?Mejora=20de=20vistas=20para=20a=C3=B1adir?= =?UTF-8?q?=20comentarios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/comments/_comment.html.erb | 6 ++++++ app/views/comments/_comment.html.erb~ | 7 +++++++ app/views/comments/_form.html.erb | 1 - app/views/comments/_form.html.erb~ | 10 ++++++++++ app/views/sites/show.html.erb | 9 +++++---- app/views/sites/show.html.erb~ | 7 ++++--- 6 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 app/views/comments/_comment.html.erb~ create mode 100644 app/views/comments/_form.html.erb~ diff --git a/app/views/comments/_comment.html.erb b/app/views/comments/_comment.html.erb index 3cd335f..1468745 100644 --- a/app/views/comments/_comment.html.erb +++ b/app/views/comments/_comment.html.erb @@ -1,3 +1,9 @@

<%= comment.coment %>

+ +

+ <%= link_to 'Destroy Comment', [comment.site, comment], + :confirm => 'Are you sure?', + :method => :delete %> +

diff --git a/app/views/comments/_comment.html.erb~ b/app/views/comments/_comment.html.erb~ new file mode 100644 index 0000000..452fcac --- /dev/null +++ b/app/views/comments/_comment.html.erb~ @@ -0,0 +1,7 @@ + + +

+ <%= link_to 'Destroy Comment', [comment.site, comment], + :confirm => 'Are you sure?', + :method => :delete %> +

diff --git a/app/views/comments/_form.html.erb b/app/views/comments/_form.html.erb index dc33f8d..614ecd4 100644 --- a/app/views/comments/_form.html.erb +++ b/app/views/comments/_form.html.erb @@ -1,6 +1,5 @@ <%= form_for([@site, @site.comments.build]) do |f| %>
- <%= f.label :coment %>
<%= f.text_area :coment %>
diff --git a/app/views/comments/_form.html.erb~ b/app/views/comments/_form.html.erb~ new file mode 100644 index 0000000..dc33f8d --- /dev/null +++ b/app/views/comments/_form.html.erb~ @@ -0,0 +1,10 @@ +<%= form_for([@site, @site.comments.build]) do |f| %> +
+ <%= f.label :coment %>
+ <%= f.text_area :coment %> +
+ +
+ <%= f.submit %> +
+<% end %> diff --git a/app/views/sites/show.html.erb b/app/views/sites/show.html.erb index c7dff44..fce745b 100644 --- a/app/views/sites/show.html.erb +++ b/app/views/sites/show.html.erb @@ -12,11 +12,12 @@ -Comentarios - <%= render @site.comments %> +Comentarios: + <%= render @site.comments %>

Añada su comentario: - <%= render "comments/form" %> +

Añada su comentario: + <%= render "comments/form" %>

<% if @site.user == current_user %> diff --git a/app/views/sites/show.html.erb~ b/app/views/sites/show.html.erb~ index c7dff44..455b55c 100644 --- a/app/views/sites/show.html.erb~ +++ b/app/views/sites/show.html.erb~ @@ -13,10 +13,11 @@ Comentarios - <%= render @site.comments %> + <%= render @site.comments %>

Añada su comentario: - <%= render "comments/form" %> +

Añada su comentario: + <%= render "comments/form" %>

<% if @site.user == current_user %> From 4381b1407be17146821329dfffd1d6eb5a96b4c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Fri, 13 Apr 2012 20:54:19 +0200 Subject: [PATCH 26/56] =?UTF-8?q?Mejora=20de=20vistas=20para=20a=C3=B1adir?= =?UTF-8?q?=20comentarios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/comments/_comment.html.erb | 2 ++ app/views/comments/_comment.html.erb~ | 6 +++++- app/views/sites/show.html.erb | 3 +++ app/views/sites/show.html.erb~ | 5 ++++- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/views/comments/_comment.html.erb b/app/views/comments/_comment.html.erb index 1468745..690a045 100644 --- a/app/views/comments/_comment.html.erb +++ b/app/views/comments/_comment.html.erb @@ -2,8 +2,10 @@ <%= comment.coment %>

+<% if @site.user == current_user %>

<%= link_to 'Destroy Comment', [comment.site, comment], :confirm => 'Are you sure?', :method => :delete %>

+<% end %> diff --git a/app/views/comments/_comment.html.erb~ b/app/views/comments/_comment.html.erb~ index 452fcac..690a045 100644 --- a/app/views/comments/_comment.html.erb~ +++ b/app/views/comments/_comment.html.erb~ @@ -1,7 +1,11 @@ +

+ <%= comment.coment %> +

- +<% if @site.user == current_user %>

<%= link_to 'Destroy Comment', [comment.site, comment], :confirm => 'Are you sure?', :method => :delete %>

+<% end %> diff --git a/app/views/sites/show.html.erb b/app/views/sites/show.html.erb index fce745b..c180072 100644 --- a/app/views/sites/show.html.erb +++ b/app/views/sites/show.html.erb @@ -12,9 +12,12 @@ +<% if @site.comments!=[] %> Comentarios: <%= render @site.comments %>

+

Añada su comentario: <%= render "comments/form" %>

-Comentarios +<% unless @site.comments %> +Comentarios: <%= render @site.comments %>

+

Añada su comentario: <%= render "comments/form" %>

Date: Fri, 13 Apr 2012 21:19:38 +0200 Subject: [PATCH 27/56] =?UTF-8?q?Mejora=20de=20vistas=20para=20a=C3=B1adir?= =?UTF-8?q?=20comentarios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/comments_controller.rb | 6 ++- app/controllers/comments_controller.rb~ | 13 ++--- app/views/comments/index.html.erb | 34 ++++++------- app/views/comments/index.html.erb~ | 21 ++++++++ app/views/sites/index.html.erb | 5 +- app/views/sites/index.html.erb~ | 64 +++++++++++++------------ config/routes.rb | 2 +- config/routes.rb~ | 5 +- 8 files changed, 86 insertions(+), 64 deletions(-) create mode 100644 app/views/comments/index.html.erb~ diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 9e81878..7dbd578 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -2,11 +2,15 @@ class CommentsController < ApplicationController # GET /comments # GET /comments.json def index + if params[:site_id].nil? or params[:site_id].empty? @comments = Comment.all + else + @comments = Site.find(params[:site_id]).comments # path: /sites/id/coment + end respond_to do |format| format.html # index.html.erb - format.json { render json: @comments } + format.json { render json: @coments } end end diff --git a/app/controllers/comments_controller.rb~ b/app/controllers/comments_controller.rb~ index da5f13f..9e81878 100644 --- a/app/controllers/comments_controller.rb~ +++ b/app/controllers/comments_controller.rb~ @@ -40,17 +40,10 @@ class CommentsController < ApplicationController # POST /comments # POST /comments.json def create - @comment = Comment.new(params[:comment]) + @site = Site.find(params[:site_id]) + @coment = @site.comments.create(params[:comment]) - respond_to do |format| - if @comment.save - format.html { redirect_to @comment, notice: 'Comment was successfully created.' } - format.json { render json: @comment, status: :created, location: @comment } - else - format.html { render action: "new" } - format.json { render json: @comment.errors, status: :unprocessable_entity } - end - end + redirect_to site_path(@site) end # PUT /comments/1 diff --git a/app/views/comments/index.html.erb b/app/views/comments/index.html.erb index 3b83e1c..f00dfd2 100644 --- a/app/views/comments/index.html.erb +++ b/app/views/comments/index.html.erb @@ -1,21 +1,21 @@ -

Listing comments

+

Comentarios del sitio

- - - - - - +
+ <% @comments.each do |comment| %> + + + + + + <% end %> +
+
+
<%= truncate(strip_tags(comment.coment), + :length => 240) %>
+
+
+ -<% @comments.each do |comment| %> - - <%= link_to 'Show', comment %> - <%= link_to 'Edit', edit_comment_path(comment) %> - <%= link_to 'Destroy', comment, confirm: 'Are you sure?', method: :delete %> - -<% end %> - - -
<%= link_to 'New Comment', new_comment_path %> + diff --git a/app/views/comments/index.html.erb~ b/app/views/comments/index.html.erb~ new file mode 100644 index 0000000..f00dfd2 --- /dev/null +++ b/app/views/comments/index.html.erb~ @@ -0,0 +1,21 @@ +

Comentarios del sitio

+ + + <% @comments.each do |comment| %> + + + + + + <% end %> +
+
+
<%= truncate(strip_tags(comment.coment), + :length => 240) %>
+
+
+ + + +<%= link_to 'New Comment', new_comment_path %> + diff --git a/app/views/sites/index.html.erb b/app/views/sites/index.html.erb index 750f828..ebfea98 100644 --- a/app/views/sites/index.html.erb +++ b/app/views/sites/index.html.erb @@ -14,9 +14,10 @@
<%= link_to site.name, site %>
<%= truncate(strip_tags(site.description), :length => 80) %>
+ <%= link_to 'Comentarios', site_comments_path(site.id) %> - + <%= link_to 'Show', site %>
<% if site.user == current_user %> @@ -30,7 +31,7 @@ <% end %> - +
<%= link_to 'New site', new_site_path %> diff --git a/app/views/sites/index.html.erb~ b/app/views/sites/index.html.erb~ index 2667817..e51d07d 100644 --- a/app/views/sites/index.html.erb~ +++ b/app/views/sites/index.html.erb~ @@ -1,36 +1,38 @@ -
-

Listing Sites

- - +
+

Listing Sites

+ +
<% @sites.each do |site| %> - - - - - + + + + + + <%= link_to 'Comentarios', site_comments_path(site.id) %> + + + <% end %> +
- <%= link_to image_tag(site.image_url, :class => 'list_image'), site %> - -
-
- <%= link_to site.name, site %>
-
- <%= truncate(strip_tags(site.description), :length => 80) %>
-
-
+ <%= link_to image_tag(site.image_url, :class => 'list_image'), site %> + +
+
<%= link_to site.name, site %>
+
<%= truncate(strip_tags(site.description), + :length => 80) %>
+
+
+ <%= 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 %> +
+
- - <%= 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 %>
- - -<% end %> - -
+
+ <%= link_to 'New site', new_site_path %> diff --git a/config/routes.rb b/config/routes.rb index 8c30bc5..2833468 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,5 @@ Planet::Application.routes.draw do - + resources :comments resources :trips diff --git a/config/routes.rb~ b/config/routes.rb~ index 4ac75d1..8c30bc5 100644 --- a/config/routes.rb~ +++ b/config/routes.rb~ @@ -1,12 +1,13 @@ Planet::Application.routes.draw do - resources :comments resources :trips devise_for :users - resources :sites + resources :sites do + resources :comments + end resources :types do # Rutas anidadas /types/id/sites..., resources :sites, :only => [ :index ] # Restringe a acción “index” From b6a7cc13f4cf675e64d3b659f00b233171a2eef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Fri, 13 Apr 2012 21:48:03 +0200 Subject: [PATCH 28/56] =?UTF-8?q?Mejora=20de=20vistas=20para=20a=C3=B1adir?= =?UTF-8?q?=20comentarios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/comments/index.html.erb | 1 + app/views/comments/index.html.erb~ | 1 + 2 files changed, 2 insertions(+) diff --git a/app/views/comments/index.html.erb b/app/views/comments/index.html.erb index f00dfd2..5687809 100644 --- a/app/views/comments/index.html.erb +++ b/app/views/comments/index.html.erb @@ -1,3 +1,4 @@ +

Comentarios del sitio

diff --git a/app/views/comments/index.html.erb~ b/app/views/comments/index.html.erb~ index f00dfd2..fe952ff 100644 --- a/app/views/comments/index.html.erb~ +++ b/app/views/comments/index.html.erb~ @@ -16,6 +16,7 @@
+
<%= link_to 'New Comment', new_comment_path %> From d0e97aea0f0569bfa95cdc4ed929ea6da3e1992f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Sat, 14 Apr 2012 10:22:48 +0200 Subject: [PATCH 29/56] =?UTF-8?q?cambios=20en=20las=20vistas=20para=20a?= =?UTF-8?q?=C3=B1adir=20los=20comentarios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/comments/_comment.html.erb | 31 +++++++++++++++++++--------- app/views/sites/index.html.erb | 4 +++- app/views/sites/index.html.erb~ | 4 +++- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/app/views/comments/_comment.html.erb b/app/views/comments/_comment.html.erb index 690a045..8768ef8 100644 --- a/app/views/comments/_comment.html.erb +++ b/app/views/comments/_comment.html.erb @@ -1,11 +1,22 @@ -

- <%= comment.coment %> -

+
-<% if @site.user == current_user %> -

- <%= link_to 'Destroy Comment', [comment.site, comment], - :confirm => 'Are you sure?', - :method => :delete %> -

-<% end %> + + + + + + <% end %> +
+
+
<%= truncate(strip_tags(comment.coment), + :length => 240) %>
+
+
+ <% if comment.user == current_user %> + <%= link_to 'Edit', [comment.site, comment], + :method => :edit %>
+ <%= link_to 'Destroy', [comment.site, comment], + :confirm => 'Are you sure?', + :method => :delete %> +
+
diff --git a/app/views/sites/index.html.erb b/app/views/sites/index.html.erb index ebfea98..99f8753 100644 --- a/app/views/sites/index.html.erb +++ b/app/views/sites/index.html.erb @@ -14,7 +14,9 @@
<%= link_to site.name, site %>
<%= truncate(strip_tags(site.description), :length => 80) %>
- <%= link_to 'Comentarios', site_comments_path(site.id) %> + <% if site.comments !=[] %> + Existen comentarios + <% end %> diff --git a/app/views/sites/index.html.erb~ b/app/views/sites/index.html.erb~ index e51d07d..b6604e0 100644 --- a/app/views/sites/index.html.erb~ +++ b/app/views/sites/index.html.erb~ @@ -14,10 +14,12 @@
<%= link_to site.name, site %>
<%= truncate(strip_tags(site.description), :length => 80) %>
+ <% if site.comment !=[] %> + Existen comentarios + <% end %> - <%= link_to 'Comentarios', site_comments_path(site.id) %> <%= link_to 'Show', site %>
<% if site.user == current_user %> From ec36662314c462b811a472b236fe5d4672d9afcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Sat, 14 Apr 2012 10:27:04 +0200 Subject: [PATCH 30/56] =?UTF-8?q?cambios=20en=20las=20vistas=20para=20a?= =?UTF-8?q?=C3=B1adir=20los=20comentarios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/sites/index.html.erb | 2 +- app/views/sites/index.html.erb~ | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/sites/index.html.erb b/app/views/sites/index.html.erb index 99f8753..0231834 100644 --- a/app/views/sites/index.html.erb +++ b/app/views/sites/index.html.erb @@ -15,7 +15,7 @@
<%= truncate(strip_tags(site.description), :length => 80) %>
<% if site.comments !=[] %> - Existen comentarios + Existen <%= link_to 'comentarios', site %> <% end %> diff --git a/app/views/sites/index.html.erb~ b/app/views/sites/index.html.erb~ index b6604e0..4a7b468 100644 --- a/app/views/sites/index.html.erb~ +++ b/app/views/sites/index.html.erb~ @@ -14,8 +14,8 @@
<%= link_to site.name, site %>
<%= truncate(strip_tags(site.description), :length => 80) %>
- <% if site.comment !=[] %> - Existen comentarios + <% if site.comments !=[] %> + Existen <%= link_to comentarios, site %> <% end %> From 9f96e7b27cb5275d011c9a9536d89de330e2a0ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Sat, 14 Apr 2012 10:35:11 +0200 Subject: [PATCH 31/56] =?UTF-8?q?cambios=20en=20las=20vistas=20para=20a?= =?UTF-8?q?=C3=B1adir=20los=20comentarios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/comments/_form.html.erb~ | 3 ++- app/views/sites/show.html.erb | 2 +- app/views/sites/show.html.erb~ | 6 ++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/views/comments/_form.html.erb~ b/app/views/comments/_form.html.erb~ index dc33f8d..8490688 100644 --- a/app/views/comments/_form.html.erb~ +++ b/app/views/comments/_form.html.erb~ @@ -1,6 +1,6 @@ <%= form_for([@site, @site.comments.build]) do |f| %> +<% if site.user == current_user %>
- <%= f.label :coment %>
<%= f.text_area :coment %>
@@ -8,3 +8,4 @@ <%= f.submit %> <% end %> +<% end %> diff --git a/app/views/sites/show.html.erb b/app/views/sites/show.html.erb index c180072..2c465a6 100644 --- a/app/views/sites/show.html.erb +++ b/app/views/sites/show.html.erb @@ -18,7 +18,7 @@ <% end %> -

Añada su comentario: +

Añada su comentario: (Ingrese para comentar) <%= render "comments/form" %>

-<% unless @site.comments %> +<% if @site.comments!=[] %> Comentarios: <%= render @site.comments %>

-

Añada su comentario: +

Añada su comentario: (Ingrese para comentar) +<% if @site.user == current_user %> <%= render "comments/form" %>

From 291e6ea5b3b719eec5c82b01c038b21c5240ecbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Sat, 14 Apr 2012 10:54:33 +0200 Subject: [PATCH 32/56] cambios controlador de sites --- app/controllers/sites_controller.rb | 13 ++++++----- app/controllers/sites_controller.rb~ | 17 ++++++++------ app/views/comments/_comment.html.erb~ | 32 ++++++++++++++++++--------- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/app/controllers/sites_controller.rb b/app/controllers/sites_controller.rb index b8c55f3..4f6cca3 100644 --- a/app/controllers/sites_controller.rb +++ b/app/controllers/sites_controller.rb @@ -1,4 +1,7 @@ class SitesController < ApplicationController + # authenticate_user! ejecuta acción solo si sesión existe + before_filter :authenticate_user!, :except => [ :index, :show ] + after_filter :count_visit, :only => :show # GET /sites # GET /sites.json def index @@ -27,7 +30,7 @@ def show # GET /sites/new # GET /sites/new.json def new - @site = Site.new + @site = current_user.sites.build # crea sitio vacio asociado a current_user respond_to do |format| format.html # new.html.erb @@ -37,13 +40,13 @@ def new # GET /sites/1/edit def edit - @site = Site.find(params[:id]) + @site = current_user.sites.find(params[:id]) # busca solo en sitios asociados a current_user end # POST /sites # POST /sites.json def create - @site = Site.new(params[:site]) + @site = current_user.sites.build(params[:site]) # Asigna solo si sitio asociado a current_user respond_to do |format| if @site.save @@ -59,7 +62,7 @@ def create # PUT /sites/1 # PUT /sites/1.json def update - @site = Site.find(params[:id]) + @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]) @@ -75,7 +78,7 @@ def update # DELETE /sites/1 # DELETE /sites/1.json def destroy - @site = Site.find(params[:id]) + @site = current_user.sites.find(params[:id]) # busca solo en sitios asociados a current_user @site.destroy respond_to do |format| diff --git a/app/controllers/sites_controller.rb~ b/app/controllers/sites_controller.rb~ index 9e4d602..02264c0 100644 --- a/app/controllers/sites_controller.rb~ +++ b/app/controllers/sites_controller.rb~ @@ -1,7 +1,10 @@ class SitesController < ApplicationController + # authenticate_user! ejecuta acción solo si sesión existe + before_filter :authenticate_user!, :except => [ :index, :show ] + after_filter :count_visit, :only => :show # GET /sites # GET /sites.json - def index + def index if params[:type_id].nil? or params[:type_id].empty? @sites = Site.all # path: /types else @@ -28,7 +31,7 @@ class SitesController < ApplicationController # GET /sites/new.json 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 } @@ -37,14 +40,14 @@ class SitesController < ApplicationController # GET /sites/1/edit def edit - @site = current_user.sites.find(params[:id]) # busca solo en sitios asociados a current_user + @site = current_user.sites.find(params[:id]) # busca solo en sitios asociados a current_user end # POST /sites # POST /sites.json 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.' } @@ -59,8 +62,8 @@ class SitesController < ApplicationController # PUT /sites/1 # PUT /sites/1.json def update - @site = current_user.sites.find(params[:id]) # busca solo en sitios asociados a current_user - + @site = Site.find(params[:id]) + respond_to do |format| if @site.update_attributes(params[:site]) format.html { redirect_to @site, notice: 'Site was successfully updated.' } @@ -75,7 +78,7 @@ class SitesController < ApplicationController # DELETE /sites/1 # DELETE /sites/1.json def destroy - @site = current_user.sites.find(params[:id]) # busca solo en sitios asociados a current_user + @site = Site.find(params[:id]) @site.destroy respond_to do |format| diff --git a/app/views/comments/_comment.html.erb~ b/app/views/comments/_comment.html.erb~ index 690a045..864032b 100644 --- a/app/views/comments/_comment.html.erb~ +++ b/app/views/comments/_comment.html.erb~ @@ -1,11 +1,23 @@ -

- <%= comment.coment %> -

+
-<% if @site.user == current_user %> -

- <%= link_to 'Destroy Comment', [comment.site, comment], - :confirm => 'Are you sure?', - :method => :delete %> -

-<% end %> + + + + + + <% end %> +
+
+
<%= comment.user.name %>
+
<%= truncate(strip_tags(comment.coment), + :length => 240) %>
+
+
+ <% if comment.user == current_user %> + <%= link_to 'Edit', [comment.site, comment], + :method => :edit %>
+ <%= link_to 'Destroy', [comment.site, comment], + :confirm => 'Are you sure?', + :method => :delete %> +
+
From d14e441a0915bd377d6d16bb5d32ed2fc0e1cea6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Sat, 14 Apr 2012 12:07:06 +0200 Subject: [PATCH 33/56] correcciones --- app/controllers/comments_controller.rb | 7 ++++--- app/controllers/comments_controller.rb~ | 14 ++++++++++---- app/controllers/sites_controller.rb | 2 +- app/controllers/sites_controller.rb~ | 8 ++++---- app/views/comments/_comment.html.erb~ | 1 - app/views/comments/_form.html.erb | 2 ++ app/views/comments/_form.html.erb~ | 3 ++- app/views/sites/show.html.erb~ | 2 -- config/routes.rb | 4 +++- config/routes.rb~ | 6 +++++- 10 files changed, 31 insertions(+), 18 deletions(-) diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 7dbd578..8e276fb 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -1,4 +1,5 @@ class CommentsController < ApplicationController + # GET /comments # GET /comments.json def index @@ -36,9 +37,8 @@ def new end end - # GET /comments/1/edit def edit - @comment = Comment.find(params[:id]) + @comments = Site.find(params[:site_id]).comments end # POST /comments @@ -53,7 +53,8 @@ def create # PUT /comments/1 # PUT /comments/1.json def update - @comment = Comment.find(params[:id]) + @site = Site.find(params[:site_id]) + @coment = @site.comments.find(params[:id]) respond_to do |format| if @comment.update_attributes(params[:comment]) diff --git a/app/controllers/comments_controller.rb~ b/app/controllers/comments_controller.rb~ index 9e81878..08ecabf 100644 --- a/app/controllers/comments_controller.rb~ +++ b/app/controllers/comments_controller.rb~ @@ -1,12 +1,17 @@ class CommentsController < ApplicationController + # GET /comments # GET /comments.json def index + if params[:site_id].nil? or params[:site_id].empty? @comments = Comment.all + else + @comments = Site.find(params[:site_id]).comments # path: /sites/id/coment + end respond_to do |format| format.html # index.html.erb - format.json { render json: @comments } + format.json { render json: @coments } end end @@ -32,9 +37,9 @@ class CommentsController < ApplicationController end end - # GET /comments/1/edit def edit - @comment = Comment.find(params[:id]) + @site = Site.find(params[:site_id]) + @coment = @site.comments.find(params[:id]) end # POST /comments @@ -49,7 +54,8 @@ class CommentsController < ApplicationController # PUT /comments/1 # PUT /comments/1.json def update - @comment = Comment.find(params[:id]) + @site = Site.find(params[:site_id]) + @coment = @site.comments.find(params[:id]) respond_to do |format| if @comment.update_attributes(params[:comment]) diff --git a/app/controllers/sites_controller.rb b/app/controllers/sites_controller.rb index 4f6cca3..497edcd 100644 --- a/app/controllers/sites_controller.rb +++ b/app/controllers/sites_controller.rb @@ -1,7 +1,7 @@ class SitesController < ApplicationController # authenticate_user! ejecuta acción solo si sesión existe before_filter :authenticate_user!, :except => [ :index, :show ] - after_filter :count_visit, :only => :show + # GET /sites # GET /sites.json def index diff --git a/app/controllers/sites_controller.rb~ b/app/controllers/sites_controller.rb~ index 02264c0..d90760d 100644 --- a/app/controllers/sites_controller.rb~ +++ b/app/controllers/sites_controller.rb~ @@ -1,7 +1,7 @@ class SitesController < ApplicationController # authenticate_user! ejecuta acción solo si sesión existe before_filter :authenticate_user!, :except => [ :index, :show ] - after_filter :count_visit, :only => :show + # GET /sites # GET /sites.json def index @@ -62,11 +62,11 @@ class SitesController < ApplicationController # PUT /sites/1 # PUT /sites/1.json def update - @site = Site.find(params[:id]) + @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.html { redirect_to @site } format.json { head :no_content } else format.html { render action: "edit" } @@ -78,7 +78,7 @@ class SitesController < ApplicationController # DELETE /sites/1 # DELETE /sites/1.json def destroy - @site = Site.find(params[:id]) + @site = current_user.sites.find(params[:id]) # busca solo en sitios asociados a current_user @site.destroy respond_to do |format| diff --git a/app/views/comments/_comment.html.erb~ b/app/views/comments/_comment.html.erb~ index 864032b..8768ef8 100644 --- a/app/views/comments/_comment.html.erb~ +++ b/app/views/comments/_comment.html.erb~ @@ -3,7 +3,6 @@
-
<%= comment.user.name %>
<%= truncate(strip_tags(comment.coment), :length => 240) %>
diff --git a/app/views/comments/_form.html.erb b/app/views/comments/_form.html.erb index 614ecd4..212ce02 100644 --- a/app/views/comments/_form.html.erb +++ b/app/views/comments/_form.html.erb @@ -1,3 +1,4 @@ + <%= form_for([@site, @site.comments.build]) do |f| %>
<%= f.text_area :coment %> @@ -7,3 +8,4 @@ <%= f.submit %>
<% end %> + diff --git a/app/views/comments/_form.html.erb~ b/app/views/comments/_form.html.erb~ index 8490688..bbf8f0c 100644 --- a/app/views/comments/_form.html.erb~ +++ b/app/views/comments/_form.html.erb~ @@ -1,5 +1,6 @@ + +<%= unless authenticate_user! %> <%= form_for([@site, @site.comments.build]) do |f| %> -<% if site.user == current_user %>
<%= f.text_area :coment %>
diff --git a/app/views/sites/show.html.erb~ b/app/views/sites/show.html.erb~ index c238f21..2c465a6 100644 --- a/app/views/sites/show.html.erb~ +++ b/app/views/sites/show.html.erb~ @@ -19,9 +19,7 @@ <% end %>

Añada su comentario: (Ingrese para comentar) -<% if @site.user == current_user %> <%= render "comments/form" %>

diff --git a/config/routes.rb b/config/routes.rb index 2833468..977e3cd 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,6 @@ Planet::Application.routes.draw do + devise_for :users #añade rutas devise + resources :comments resources :trips @@ -6,7 +8,7 @@ devise_for :users resources :sites do - resources :comments + resources :comments end resources :types do # Rutas anidadas /types/id/sites..., diff --git a/config/routes.rb~ b/config/routes.rb~ index 8c30bc5..4b22e56 100644 --- a/config/routes.rb~ +++ b/config/routes.rb~ @@ -1,12 +1,16 @@ Planet::Application.routes.draw do + devise_for :users #añade rutas devise + resources :comments resources :trips devise_for :users resources :sites do - resources :comments + resources :comments do + resources :comments + end end resources :types do # Rutas anidadas /types/id/sites..., From b4a1c5c1c73cc8b47e2dacb21cc6ceb5133fefc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Sat, 14 Apr 2012 12:35:07 +0200 Subject: [PATCH 34/56] =?UTF-8?q?cambios=20en=20las=20vistas=20para=20a?= =?UTF-8?q?=C3=B1adir=20los=20comentarios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/comments_controller.rb | 7 ++++--- app/controllers/comments_controller.rb~ | 8 ++++---- app/controllers/sites_controller.rb~ | 2 +- app/views/comments/_comment.html.erb | 2 +- app/views/comments/_comment.html.erb~ | 2 +- app/views/comments/edit.html.erb | 25 +++++++++++++++++++++---- app/views/comments/edit.html.erb~ | 3 +++ 7 files changed, 35 insertions(+), 14 deletions(-) create mode 100644 app/views/comments/edit.html.erb~ diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 8e276fb..0153295 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -6,7 +6,7 @@ def index if params[:site_id].nil? or params[:site_id].empty? @comments = Comment.all else - @comments = Site.find(params[:site_id]).comments # path: /sites/id/coment + @comments = Site.find(params[:site_id]).comments # path: /sites/id/comment end respond_to do |format| @@ -38,14 +38,15 @@ def new end def edit - @comments = Site.find(params[:site_id]).comments + @site = Site.find(params[:site_id]) + @comment = @site.comments.find(params[:comment]) end # POST /comments # POST /comments.json def create @site = Site.find(params[:site_id]) - @coment = @site.comments.create(params[:comment]) + @comment = @site.comments.create(params[:comment]) redirect_to site_path(@site) end diff --git a/app/controllers/comments_controller.rb~ b/app/controllers/comments_controller.rb~ index 08ecabf..0153295 100644 --- a/app/controllers/comments_controller.rb~ +++ b/app/controllers/comments_controller.rb~ @@ -6,7 +6,7 @@ class CommentsController < ApplicationController if params[:site_id].nil? or params[:site_id].empty? @comments = Comment.all else - @comments = Site.find(params[:site_id]).comments # path: /sites/id/coment + @comments = Site.find(params[:site_id]).comments # path: /sites/id/comment end respond_to do |format| @@ -38,15 +38,15 @@ class CommentsController < ApplicationController end def edit - @site = Site.find(params[:site_id]) - @coment = @site.comments.find(params[:id]) + @site = Site.find(params[:site_id]) + @comment = @site.comments.find(params[:comment]) end # POST /comments # POST /comments.json def create @site = Site.find(params[:site_id]) - @coment = @site.comments.create(params[:comment]) + @comment = @site.comments.create(params[:comment]) redirect_to site_path(@site) end diff --git a/app/controllers/sites_controller.rb~ b/app/controllers/sites_controller.rb~ index d90760d..497edcd 100644 --- a/app/controllers/sites_controller.rb~ +++ b/app/controllers/sites_controller.rb~ @@ -66,7 +66,7 @@ class SitesController < ApplicationController respond_to do |format| if @site.update_attributes(params[:site]) - format.html { redirect_to @site } + format.html { redirect_to @site, notice: 'Site was successfully updated.' } format.json { head :no_content } else format.html { render action: "edit" } diff --git a/app/views/comments/_comment.html.erb b/app/views/comments/_comment.html.erb index 8768ef8..5bbc08a 100644 --- a/app/views/comments/_comment.html.erb +++ b/app/views/comments/_comment.html.erb @@ -11,7 +11,7 @@

<% if comment.user == current_user %> <%= link_to 'Edit', [comment.site, comment], - :method => :edit %>
+ :method => :edit %>
<%= link_to 'Destroy', [comment.site, comment], :confirm => 'Are you sure?', :method => :delete %> diff --git a/app/views/comments/_comment.html.erb~ b/app/views/comments/_comment.html.erb~ index 8768ef8..fcd89e6 100644 --- a/app/views/comments/_comment.html.erb~ +++ b/app/views/comments/_comment.html.erb~ @@ -11,7 +11,7 @@
<% if comment.user == current_user %> <%= link_to 'Edit', [comment.site, comment], - :method => :edit %>
+ :edit %>
<%= link_to 'Destroy', [comment.site, comment], :confirm => 'Are you sure?', :method => :delete %> diff --git a/app/views/comments/edit.html.erb b/app/views/comments/edit.html.erb index 12ea7f9..f7fc507 100644 --- a/app/views/comments/edit.html.erb +++ b/app/views/comments/edit.html.erb @@ -1,6 +1,23 @@ -

Editing comment

+

Editar comentario

-<%= render 'form' %> +<%= form_for(@comment) do |f| %> + <% if @comment.errors.any? %> +
+

<%= pluralize(@comment.errors.count, "error") %> prohibited this site from being saved:

-<%= link_to 'Show', @comment %> | -<%= link_to 'Back', comments_path %> +
    + <% @comment.errors.full_messages.each do |msg| %> +
  • <%= msg %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= f.text_area :coment %> +
+ +
+ <%= f.submit %> +
+<% end %> diff --git a/app/views/comments/edit.html.erb~ b/app/views/comments/edit.html.erb~ new file mode 100644 index 0000000..7871c4a --- /dev/null +++ b/app/views/comments/edit.html.erb~ @@ -0,0 +1,3 @@ +

Editar comentario

+ + From 2d253b6b675d461d123daaf6a2c130fe3dfbe499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Sat, 14 Apr 2012 12:46:54 +0200 Subject: [PATCH 35/56] cambios en rutas --- app/controllers/comments_controller.rb~ | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/controllers/comments_controller.rb~ b/app/controllers/comments_controller.rb~ index 0153295..3d666de 100644 --- a/app/controllers/comments_controller.rb~ +++ b/app/controllers/comments_controller.rb~ @@ -40,6 +40,8 @@ class CommentsController < ApplicationController def edit @site = Site.find(params[:site_id]) @comment = @site.comments.find(params[:comment]) + + redirect_to site_path(@site) end # POST /comments From a50f37db612abc0bd17b586b5f8c0ded32904182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Sat, 14 Apr 2012 14:17:37 +0200 Subject: [PATCH 36/56] =?UTF-8?q?A=C3=B1adida=20funci=C3=B3n=20editar=20co?= =?UTF-8?q?mentario?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/comments_controller.rb | 2 +- app/controllers/comments_controller.rb~ | 4 +--- app/views/comments/_comment.html.erb | 4 ++-- app/views/comments/_comment.html.erb~ | 4 ++-- config/routes.rb~ | 11 +++-------- 5 files changed, 9 insertions(+), 16 deletions(-) diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 0153295..df9235b 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -39,7 +39,7 @@ def new def edit @site = Site.find(params[:site_id]) - @comment = @site.comments.find(params[:comment]) + @comment = @site.comments.find(params[:id]) end # POST /comments diff --git a/app/controllers/comments_controller.rb~ b/app/controllers/comments_controller.rb~ index 3d666de..df9235b 100644 --- a/app/controllers/comments_controller.rb~ +++ b/app/controllers/comments_controller.rb~ @@ -39,9 +39,7 @@ class CommentsController < ApplicationController def edit @site = Site.find(params[:site_id]) - @comment = @site.comments.find(params[:comment]) - - redirect_to site_path(@site) + @comment = @site.comments.find(params[:id]) end # POST /comments diff --git a/app/views/comments/_comment.html.erb b/app/views/comments/_comment.html.erb index 5bbc08a..1376644 100644 --- a/app/views/comments/_comment.html.erb +++ b/app/views/comments/_comment.html.erb @@ -10,8 +10,7 @@
<% if comment.user == current_user %> - <%= link_to 'Edit', [comment.site, comment], - :method => :edit %>
+ <%= link_to 'Edit', edit_site_comment_path(comment.site, comment) %>
<%= link_to 'Destroy', [comment.site, comment], :confirm => 'Are you sure?', :method => :delete %> @@ -20,3 +19,4 @@ <% end %>
+ diff --git a/app/views/comments/_comment.html.erb~ b/app/views/comments/_comment.html.erb~ index fcd89e6..ad39fc2 100644 --- a/app/views/comments/_comment.html.erb~ +++ b/app/views/comments/_comment.html.erb~ @@ -10,8 +10,7 @@ <% if comment.user == current_user %> - <%= link_to 'Edit', [comment.site, comment], - :edit %>
+ <%= link_to 'Edit', edit_site_comment_path(@site) %>
<%= link_to 'Destroy', [comment.site, comment], :confirm => 'Are you sure?', :method => :delete %> @@ -20,3 +19,4 @@ <% end %> + diff --git a/config/routes.rb~ b/config/routes.rb~ index 4b22e56..d29f20e 100644 --- a/config/routes.rb~ +++ b/config/routes.rb~ @@ -7,15 +7,10 @@ Planet::Application.routes.draw do devise_for :users - resources :sites do - resources :comments do - resources :comments - end - end - resources :types do # Rutas anidadas /types/id/sites..., - resources :sites, :only => [ :index ] # Restringe a acción “index” - + resources :sites, :only => [ :index ] do # Restringe a acción “index” + resources :comments + end get 'ordered_index', :on => :collection end From 76c6fa0c9a7d8a0de547457e520ec9e8a00805ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Sat, 14 Apr 2012 15:19:57 +0200 Subject: [PATCH 37/56] =?UTF-8?q?A=C3=B1adida=20funci=C3=B3n=20editar=20co?= =?UTF-8?q?mentario?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/comments_controller.rb | 3 +-- app/controllers/comments_controller.rb~ | 3 +-- app/views/comments/edit.html.erb~ | 20 ++++++++++++++++++++ app/views/comments/show.html.erb | 5 ++--- app/views/comments/show.html.erb~ | 4 ++++ 5 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 app/views/comments/show.html.erb~ diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index df9235b..4a8ea0d 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -54,8 +54,7 @@ def create # PUT /comments/1 # PUT /comments/1.json def update - @site = Site.find(params[:site_id]) - @coment = @site.comments.find(params[:id]) + @comment = Comment.find(params[:id]) respond_to do |format| if @comment.update_attributes(params[:comment]) diff --git a/app/controllers/comments_controller.rb~ b/app/controllers/comments_controller.rb~ index df9235b..4a8ea0d 100644 --- a/app/controllers/comments_controller.rb~ +++ b/app/controllers/comments_controller.rb~ @@ -54,8 +54,7 @@ class CommentsController < ApplicationController # PUT /comments/1 # PUT /comments/1.json def update - @site = Site.find(params[:site_id]) - @coment = @site.comments.find(params[:id]) + @comment = Comment.find(params[:id]) respond_to do |format| if @comment.update_attributes(params[:comment]) diff --git a/app/views/comments/edit.html.erb~ b/app/views/comments/edit.html.erb~ index 7871c4a..ff4f36a 100644 --- a/app/views/comments/edit.html.erb~ +++ b/app/views/comments/edit.html.erb~ @@ -1,3 +1,23 @@

Editar comentario

+<%= form_for(@comment) do |f| %> + <% if @comment.errors.any? %> +
+

<%= pluralize(@comment.errors.count, "error") %> prohibited this site from being saved:

+
    + <% @comment.errors.full_messages.each do |msg| %> +
  • <%= msg %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= f.text_area :coment %> +
+ +
+ <%= f.submit(comment.site, comment) %> +
+<% end %> diff --git a/app/views/comments/show.html.erb b/app/views/comments/show.html.erb index d5e89c7..2131ab0 100644 --- a/app/views/comments/show.html.erb +++ b/app/views/comments/show.html.erb @@ -1,5 +1,4 @@ -

<%= notice %>

+

<%= notice %> + -<%= link_to 'Edit', edit_comment_path(@comment) %> | -<%= link_to 'Back', comments_path %> diff --git a/app/views/comments/show.html.erb~ b/app/views/comments/show.html.erb~ new file mode 100644 index 0000000..a17b811 --- /dev/null +++ b/app/views/comments/show.html.erb~ @@ -0,0 +1,4 @@ +

<%= notice %> + + + <%= render "comments/form" %>

Date: Sat, 14 Apr 2012 15:27:48 +0200 Subject: [PATCH 38/56] Corregir vistas --- app/views/sites/show.html.erb | 3 +-- app/views/sites/show.html.erb~ | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/app/views/sites/show.html.erb b/app/views/sites/show.html.erb index 2c465a6..ab61014 100644 --- a/app/views/sites/show.html.erb +++ b/app/views/sites/show.html.erb @@ -1,6 +1,5 @@ -

<%= notice %>

-
+

<%= @site.type.name if @site.type %>

<%= image_tag(@site.image_url, :class => 'site_image') %>

<%= @site.name %>

diff --git a/app/views/sites/show.html.erb~ b/app/views/sites/show.html.erb~ index 2c465a6..8ec1780 100644 --- a/app/views/sites/show.html.erb~ +++ b/app/views/sites/show.html.erb~ @@ -1,5 +1,3 @@ -

<%= notice %>

-

<%= @site.type.name if @site.type %>

<%= image_tag(@site.image_url, :class => 'site_image') %> From 92051cc708eacfa42c71c452b5cdb8ff81ef65b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Sat, 14 Apr 2012 15:58:08 +0200 Subject: [PATCH 39/56] Corregir vistas --- app/controllers/comments_controller.rb | 11 ++--------- app/views/comments/_comment.html.erb~ | 6 +++--- app/views/comments/edit.html.erb | 6 +++--- app/views/comments/edit.html.erb~ | 4 ++-- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 4a8ea0d..3845904 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -54,17 +54,10 @@ def create # PUT /comments/1 # PUT /comments/1.json def update + @site = Site.find(params[:site_id]) @comment = Comment.find(params[:id]) - respond_to do |format| - if @comment.update_attributes(params[:comment]) - format.html { redirect_to @comment, notice: 'Comment was successfully updated.' } - format.json { head :no_content } - else - format.html { render action: "edit" } - format.json { render json: @comment.errors, status: :unprocessable_entity } - end - end + redirect_to site_path(@site) end # DELETE /comments/1 diff --git a/app/views/comments/_comment.html.erb~ b/app/views/comments/_comment.html.erb~ index ad39fc2..7cd9bcc 100644 --- a/app/views/comments/_comment.html.erb~ +++ b/app/views/comments/_comment.html.erb~ @@ -10,10 +10,10 @@ <% if comment.user == current_user %> - <%= link_to 'Edit', edit_site_comment_path(@site) %>
- <%= link_to 'Destroy', [comment.site, comment], + <%= link_to 'Edit', edit_site_comment_path(comment.site, comment) %>
+ <%= link_to 'Update', [comment.site, comment], :confirm => 'Are you sure?', - :method => :delete %> + :method => :update %> <% end %> diff --git a/app/views/comments/edit.html.erb b/app/views/comments/edit.html.erb index f7fc507..2d93f5a 100644 --- a/app/views/comments/edit.html.erb +++ b/app/views/comments/edit.html.erb @@ -1,6 +1,6 @@

Editar comentario

-<%= form_for(@comment) do |f| %> +<%= form_for(@comment) do |comment| %> <% if @comment.errors.any? %>

<%= pluralize(@comment.errors.count, "error") %> prohibited this site from being saved:

@@ -14,10 +14,10 @@ <% end %>
- <%= f.text_area :coment %> + <%= comment.text_area :coment %>
- <%= f.submit %> + <%= comment.submit %>
<% end %> diff --git a/app/views/comments/edit.html.erb~ b/app/views/comments/edit.html.erb~ index ff4f36a..d81fad4 100644 --- a/app/views/comments/edit.html.erb~ +++ b/app/views/comments/edit.html.erb~ @@ -1,6 +1,6 @@

Editar comentario

-<%= form_for(@comment) do |f| %> +<%= form_for(@comment) do |comment| %> <% if @comment.errors.any? %>

<%= pluralize(@comment.errors.count, "error") %> prohibited this site from being saved:

@@ -18,6 +18,6 @@
- <%= f.submit(comment.site, comment) %> + <%= f.submit %>
<% end %> From d98e3414f39714f5ea9416e068d72e047136e381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Sat, 14 Apr 2012 16:20:05 +0200 Subject: [PATCH 40/56] Corregir vistas --- app/controllers/comments_controller.rb | 11 +++++++++-- app/controllers/comments_controller.rb~ | 13 +++---------- app/views/comments/_comment.html.erb~ | 4 +++- app/views/comments/_form.html.erb | 1 - app/views/comments/_form.html.erb~ | 3 +-- app/views/comments/edit.html.erb~ | 4 ++-- app/views/comments/show.html.erb | 2 +- app/views/comments/show.html.erb~ | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 3845904..4a8ea0d 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -54,10 +54,17 @@ def create # PUT /comments/1 # PUT /comments/1.json def update - @site = Site.find(params[:site_id]) @comment = Comment.find(params[:id]) - redirect_to site_path(@site) + respond_to do |format| + if @comment.update_attributes(params[:comment]) + format.html { redirect_to @comment, notice: 'Comment was successfully updated.' } + format.json { head :no_content } + else + format.html { render action: "edit" } + format.json { render json: @comment.errors, status: :unprocessable_entity } + end + end end # DELETE /comments/1 diff --git a/app/controllers/comments_controller.rb~ b/app/controllers/comments_controller.rb~ index 4a8ea0d..9f9f692 100644 --- a/app/controllers/comments_controller.rb~ +++ b/app/controllers/comments_controller.rb~ @@ -11,7 +11,7 @@ class CommentsController < ApplicationController respond_to do |format| format.html # index.html.erb - format.json { render json: @coments } + format.json { render json: @comments } end end @@ -54,17 +54,10 @@ class CommentsController < ApplicationController # PUT /comments/1 # PUT /comments/1.json def update + @site = Site.find(params[:site_id]) @comment = Comment.find(params[:id]) - respond_to do |format| - if @comment.update_attributes(params[:comment]) - format.html { redirect_to @comment, notice: 'Comment was successfully updated.' } - format.json { head :no_content } - else - format.html { render action: "edit" } - format.json { render json: @comment.errors, status: :unprocessable_entity } - end - end + redirect_to site_path(@site) end # DELETE /comments/1 diff --git a/app/views/comments/_comment.html.erb~ b/app/views/comments/_comment.html.erb~ index 7cd9bcc..851334c 100644 --- a/app/views/comments/_comment.html.erb~ +++ b/app/views/comments/_comment.html.erb~ @@ -11,8 +11,10 @@ <% if comment.user == current_user %> <%= link_to 'Edit', edit_site_comment_path(comment.site, comment) %>
- <%= link_to 'Update', [comment.site, comment], + <%= link_to 'Destroy', [comment.site, comment], :confirm => 'Are you sure?', + :method => :delete %> + <%= link_to 'Dd', [comment.site, comment], :method => :update %> diff --git a/app/views/comments/_form.html.erb b/app/views/comments/_form.html.erb index 212ce02..466fb0f 100644 --- a/app/views/comments/_form.html.erb +++ b/app/views/comments/_form.html.erb @@ -1,4 +1,3 @@ - <%= form_for([@site, @site.comments.build]) do |f| %>
<%= f.text_area :coment %> diff --git a/app/views/comments/_form.html.erb~ b/app/views/comments/_form.html.erb~ index bbf8f0c..212ce02 100644 --- a/app/views/comments/_form.html.erb~ +++ b/app/views/comments/_form.html.erb~ @@ -1,5 +1,4 @@ -<%= unless authenticate_user! %> <%= form_for([@site, @site.comments.build]) do |f| %>
<%= f.text_area :coment %> @@ -9,4 +8,4 @@ <%= f.submit %>
<% end %> -<% end %> + diff --git a/app/views/comments/edit.html.erb~ b/app/views/comments/edit.html.erb~ index d81fad4..fb35813 100644 --- a/app/views/comments/edit.html.erb~ +++ b/app/views/comments/edit.html.erb~ @@ -14,10 +14,10 @@ <% end %>
- <%= f.text_area :coment %> + <%= comment.text_area :coment %>
- <%= f.submit %> + #<%= comment.submit %>
<% end %> diff --git a/app/views/comments/show.html.erb b/app/views/comments/show.html.erb index 2131ab0..fd40910 100644 --- a/app/views/comments/show.html.erb +++ b/app/views/comments/show.html.erb @@ -1,4 +1,4 @@ -

<%= notice %> + diff --git a/app/views/comments/show.html.erb~ b/app/views/comments/show.html.erb~ index a17b811..2131ab0 100644 --- a/app/views/comments/show.html.erb~ +++ b/app/views/comments/show.html.erb~ @@ -1,4 +1,4 @@

<%= notice %> - <%= render "comments/form" %>

Date: Sun, 15 Apr 2012 13:36:54 +0200 Subject: [PATCH 41/56] Corregir vistas --- app/controllers/comments_controller.rb | 16 ++++++++++++-- app/controllers/comments_controller.rb~ | 29 ++++++++++++++++++++----- app/views/comments/_comment.html.erb | 4 ++-- app/views/comments/_comment.html.erb~ | 2 -- app/views/sites/show.html.erb | 9 ++++++-- app/views/sites/show.html.erb~ | 1 + 6 files changed, 48 insertions(+), 13 deletions(-) diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 4a8ea0d..c5535b7 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -47,8 +47,17 @@ def edit def create @site = Site.find(params[:site_id]) @comment = @site.comments.create(params[:comment]) + @comment.user_id = current_user.id - redirect_to site_path(@site) + 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 # PUT /comments/1 @@ -74,6 +83,9 @@ def destroy @coment = @site.comments.find(params[:id]) @coment.destroy - redirect_to site_path(@site) + respond_to do |format| + format.html { redirect_to site_path(@site) } + format.json { head :no_content } + end end end diff --git a/app/controllers/comments_controller.rb~ b/app/controllers/comments_controller.rb~ index 9f9f692..c5535b7 100644 --- a/app/controllers/comments_controller.rb~ +++ b/app/controllers/comments_controller.rb~ @@ -11,7 +11,7 @@ class CommentsController < ApplicationController respond_to do |format| format.html # index.html.erb - format.json { render json: @comments } + format.json { render json: @coments } end end @@ -47,17 +47,33 @@ class CommentsController < ApplicationController def create @site = Site.find(params[:site_id]) @comment = @site.comments.create(params[:comment]) + @comment.user_id = current_user.id - redirect_to site_path(@site) + 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 # PUT /comments/1 # PUT /comments/1.json def update - @site = Site.find(params[:site_id]) @comment = Comment.find(params[:id]) - redirect_to site_path(@site) + respond_to do |format| + if @comment.update_attributes(params[:comment]) + format.html { redirect_to @comment, notice: 'Comment was successfully updated.' } + format.json { head :no_content } + else + format.html { render action: "edit" } + format.json { render json: @comment.errors, status: :unprocessable_entity } + end + end end # DELETE /comments/1 @@ -67,6 +83,9 @@ class CommentsController < ApplicationController @coment = @site.comments.find(params[:id]) @coment.destroy - redirect_to site_path(@site) + respond_to do |format| + format.html { redirect_to site_path(@site) } + format.json { head :no_content } + end end end diff --git a/app/views/comments/_comment.html.erb b/app/views/comments/_comment.html.erb index 1376644..5e8d1bc 100644 --- a/app/views/comments/_comment.html.erb +++ b/app/views/comments/_comment.html.erb @@ -3,7 +3,8 @@ @@ -19,4 +20,3 @@ <% end %>
-
<%= truncate(strip_tags(comment.coment), +
<%= comment.user.name %>
+

<%= truncate(strip_tags(comment.coment), :length => 240) %>
- diff --git a/app/views/comments/_comment.html.erb~ b/app/views/comments/_comment.html.erb~ index 851334c..1376644 100644 --- a/app/views/comments/_comment.html.erb~ +++ b/app/views/comments/_comment.html.erb~ @@ -14,8 +14,6 @@ <%= link_to 'Destroy', [comment.site, comment], :confirm => 'Are you sure?', :method => :delete %> - <%= link_to 'Dd', [comment.site, comment], - :method => :update %> <% end %> diff --git a/app/views/sites/show.html.erb b/app/views/sites/show.html.erb index ab61014..6969f02 100644 --- a/app/views/sites/show.html.erb +++ b/app/views/sites/show.html.erb @@ -17,8 +17,13 @@ <% end %> -

Añada su comentario: (Ingrese para comentar) - <%= render "comments/form" %>

Añada su comentario: +<% if current_user %> + <%= render "comments/form" %>

+ <%= link_to "Ingrese", new_user_session_path %> para comentar: + +<% end %>

diff --git a/app/views/sites/show.html.erb~ b/app/views/sites/show.html.erb~ index 8ec1780..ab61014 100644 --- a/app/views/sites/show.html.erb~ +++ b/app/views/sites/show.html.erb~ @@ -1,4 +1,5 @@

+

<%= @site.type.name if @site.type %>

<%= image_tag(@site.image_url, :class => 'site_image') %>

<%= @site.name %>

From 6df979a87d26906453ed9377de5ae3a661c4b077 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Sun, 15 Apr 2012 14:28:59 +0200 Subject: [PATCH 42/56] Corregir vistas --- app/controllers/comments_controller.rb | 23 ++++++++++++----------- app/controllers/comments_controller.rb~ | 23 ++++++++++++----------- app/controllers/sites_controller.rb~ | 19 ++++++++++--------- app/views/comments/_edit.html.erb~ | 0 app/views/comments/edit.html.erb | 3 ++- app/views/comments/edit.html.erb~ | 5 +++-- 6 files changed, 39 insertions(+), 34 deletions(-) create mode 100644 app/views/comments/_edit.html.erb~ diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index c5535b7..92ee2c4 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -63,18 +63,19 @@ def create # PUT /comments/1 # PUT /comments/1.json def update - @comment = Comment.find(params[:id]) +@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 @comment, notice: 'Comment was successfully updated.' } - format.json { head :no_content } - else - format.html { render action: "edit" } - format.json { render json: @comment.errors, status: :unprocessable_entity } - end - end - end +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 # DELETE /comments/1 # DELETE /comments/1.json diff --git a/app/controllers/comments_controller.rb~ b/app/controllers/comments_controller.rb~ index c5535b7..92ee2c4 100644 --- a/app/controllers/comments_controller.rb~ +++ b/app/controllers/comments_controller.rb~ @@ -63,18 +63,19 @@ class CommentsController < ApplicationController # PUT /comments/1 # PUT /comments/1.json def update - @comment = Comment.find(params[:id]) +@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 @comment, notice: 'Comment was successfully updated.' } - format.json { head :no_content } - else - format.html { render action: "edit" } - format.json { render json: @comment.errors, status: :unprocessable_entity } - end - end - end +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 # DELETE /comments/1 # DELETE /comments/1.json diff --git a/app/controllers/sites_controller.rb~ b/app/controllers/sites_controller.rb~ index 497edcd..14886f0 100644 --- a/app/controllers/sites_controller.rb~ +++ b/app/controllers/sites_controller.rb~ @@ -62,17 +62,18 @@ class SitesController < ApplicationController # PUT /sites/1 # PUT /sites/1.json def update - @site = current_user.sites.find(params[:id]) # busca solo en sitios asociados a current_user + @site = Site.find(params[:site_id]) + @comment = @site.comments.find(params[:id]) 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 + 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 # DELETE /sites/1 diff --git a/app/views/comments/_edit.html.erb~ b/app/views/comments/_edit.html.erb~ new file mode 100644 index 0000000..e69de29 diff --git a/app/views/comments/edit.html.erb b/app/views/comments/edit.html.erb index 2d93f5a..4bd3741 100644 --- a/app/views/comments/edit.html.erb +++ b/app/views/comments/edit.html.erb @@ -1,6 +1,6 @@

Editar comentario

-<%= form_for(@comment) do |comment| %> +<%= form_for([@site, @comment]) do |comment| %> <% if @comment.errors.any? %>

<%= pluralize(@comment.errors.count, "error") %> prohibited this site from being saved:

@@ -21,3 +21,4 @@ <%= comment.submit %>
<% end %> + diff --git a/app/views/comments/edit.html.erb~ b/app/views/comments/edit.html.erb~ index fb35813..4bd3741 100644 --- a/app/views/comments/edit.html.erb~ +++ b/app/views/comments/edit.html.erb~ @@ -1,6 +1,6 @@

Editar comentario

-<%= form_for(@comment) do |comment| %> +<%= form_for([@site, @comment]) do |comment| %> <% if @comment.errors.any? %>

<%= pluralize(@comment.errors.count, "error") %> prohibited this site from being saved:

@@ -18,6 +18,7 @@
- #<%= comment.submit %> + <%= comment.submit %>
<% end %> + From 2f69cc1cd1c18d4cc76a7d90a1db009dbf26b378 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Tue, 17 Apr 2012 08:50:08 +0200 Subject: [PATCH 43/56] Cambios en las vistas --- app/assets/stylesheets/planet.css | 32 ++++++++++++++++++++++++++++++ app/assets/stylesheets/planet.css~ | 6 ++++++ 2 files changed, 38 insertions(+) diff --git a/app/assets/stylesheets/planet.css b/app/assets/stylesheets/planet.css index c6334b0..ffbf737 100644 --- a/app/assets/stylesheets/planet.css +++ b/app/assets/stylesheets/planet.css @@ -64,6 +64,38 @@ background: #88b0f8; } +/* Styles for comments */ + +#comment_list table tr td { + padding: 5px; + vertical-align: top; +} + + +#comment_list .comment_description { + width: 60%; +} + +#comment_list .comment_description dl { + margin: 0; +} + +#comment_list .comment_description dt { + color: #244; + font-weight: bold; + font-size: small; +} + +#comment_list .comment_description dd { + margin: 0; +} + +#comment_list .comment_actions { + font-size: x-small; + text-align: right; + padding-left: 1em; +} + /* START:mainlayout */ /* Styles for main page */ diff --git a/app/assets/stylesheets/planet.css~ b/app/assets/stylesheets/planet.css~ index 28c4fcc..c6334b0 100644 --- a/app/assets/stylesheets/planet.css~ +++ b/app/assets/stylesheets/planet.css~ @@ -83,6 +83,12 @@ padding-left: 10px; } +#banner .user { + float: right; + color: #bfb; + font-size: small; +} + #columns { background: #446; } From a86199a68a6061bcc3dc3020dd4c711b77117fed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Tue, 17 Apr 2012 17:59:57 +0200 Subject: [PATCH 44/56] =?UTF-8?q?Enrequecimiento=20tabla=20sites=20y=20mig?= =?UTF-8?q?raci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- :show | 0 app/controllers/sites_controller.rb~ | 21 ++--- app/controllers/visits_controller.rb | 88 +++++++++----------- app/views/sites/show.html.erb | 4 + app/views/sites/show.html.erb~ | 25 +----- app/views/trips/index.html.erb | 1 - app/views/trips/index.html.erb~ | 4 - db/migrate/20120410143500_create_sites.rb | 5 +- db/migrate/20120410143500_create_sites.rb~ | 7 ++ db/schema.rb | 3 + db/seeds.rb~ | 93 ++++------------------ 11 files changed, 88 insertions(+), 163 deletions(-) create mode 100644 :show diff --git a/:show b/:show new file mode 100644 index 0000000..e69de29 diff --git a/app/controllers/sites_controller.rb~ b/app/controllers/sites_controller.rb~ index c8ef220..a230fc3 100644 --- a/app/controllers/sites_controller.rb~ +++ b/app/controllers/sites_controller.rb~ @@ -1,11 +1,12 @@ class SitesController < ApplicationController + # authenticate_user! ejecuta acción solo si sesión existe before_filter :authenticate_user!, :except => [ :index, :show ] - after_filter :visitas, :only => :show - + #after_filter :count_visita, :only => :show + # GET /sites # GET /sites.json - def index + def index if params[:type_id].nil? or params[:type_id].empty? @sites = Site.all # path: /types else @@ -21,7 +22,7 @@ class SitesController < ApplicationController # GET /sites/1.json def show @site = Site.find(params[:id]) - + @site.increment!(:visitas) respond_to do |format| format.html # show.html.erb format.json { render json: @site } @@ -32,7 +33,7 @@ class SitesController < ApplicationController # GET /sites/new.json 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 } @@ -41,14 +42,14 @@ class SitesController < ApplicationController # GET /sites/1/edit def edit - @site = current_user.sites.find(params[:id]) # busca solo en sitios asociados a current_user + @site = current_user.sites.find(params[:id]) # busca solo en sitios asociados a current_user end # POST /sites # POST /sites.json 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.' } @@ -63,8 +64,8 @@ class SitesController < ApplicationController # PUT /sites/1 # PUT /sites/1.json def update - @site = current_user.sites.find(params[:id]) # busca solo en sitios asociados a current_user - + @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.' } @@ -79,7 +80,7 @@ class SitesController < ApplicationController # DELETE /sites/1 # DELETE /sites/1.json def destroy - @site = current_user.sites.find(params[:id]) # busca solo en sitios asociados a current_user + @site = current_user.sites.find(params[:id]) # busca solo en sitios asociados a current_user @site.destroy respond_to do |format| diff --git a/app/controllers/visits_controller.rb b/app/controllers/visits_controller.rb index 473f5e3..5bd5366 100644 --- a/app/controllers/visits_controller.rb +++ b/app/controllers/visits_controller.rb @@ -1,96 +1,84 @@ -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 +class VisitsController < ApplicationController + # GET /visits + # GET /visits.json 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 + @visits = Visit.all + respond_to do |format| format.html # index.html.erb - format.json { render json: @sites } + format.json { render json: @visits } end end - # GET /sites/1 - # GET /sites/1.json + # GET /visits/1 + # GET /visits/1.json def show - @site = Site.find(params[:id]) + @visit = Visit.find(params[:id]) respond_to do |format| format.html # show.html.erb - format.json { render json: @site } + format.json { render json: @visit } end end - # GET /sites/new - # GET /sites/new.json + # GET /visits/new + # GET /visits/new.json def new - @site = current_user.sites.build # crea sitio vacio asociado a current_user - + @visit = Visit.new + respond_to do |format| format.html # new.html.erb - format.json { render json: @site } + format.json { render json: @visit } end end - # GET /sites/1/edit + # GET /visits/1/edit def edit - @site = current_user.sites.find(params[:id]) # busca solo en sitios asociados a current_user + @visit = Visit.find(params[:id]) end - # POST /sites - # POST /sites.json + # POST /visits + # POST /visits.json def create - @site = current_user.sites.build(params[:site]) # Asigna solo si sitio asociado a current_user - + @visit = Visit.new(params[:visit]) + 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 } + 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: @site.errors, status: :unprocessable_entity } + format.json { render json: @visit.errors, status: :unprocessable_entity } end end end - # PUT /sites/1 - # PUT /sites/1.json + # PUT /visits/1 + # PUT /visits/1.json def update - @site = current_user.sites.find(params[:id]) # busca solo en sitios asociados a current_user - + @visit = Visit.find(params[:id]) + respond_to do |format| - if @site.update_attributes(params[:site]) - format.html { redirect_to @site, notice: 'Site was successfully updated.' } + 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: @site.errors, status: :unprocessable_entity } + format.json { render json: @visit.errors, status: :unprocessable_entity } end end end - # DELETE /sites/1 - # DELETE /sites/1.json + # DELETE /visits/1 + # DELETE /visits/1.json def destroy - @site = current_user.sites.find(params[:id]) # busca solo en sitios asociados a current_user - @site.destroy + @visit = Visit.find(params[:id]) + @visit.destroy respond_to do |format| - format.html { redirect_to sites_url } + format.html { redirect_to @visit.trip } format.json { head :no_content } end end - - private - def count_visita - @site.increment!(:visitas) - end end diff --git a/app/views/sites/show.html.erb b/app/views/sites/show.html.erb index 6969f02..9bfa6f9 100644 --- a/app/views/sites/show.html.erb +++ b/app/views/sites/show.html.erb @@ -24,6 +24,10 @@ <%= link_to "Ingrese", new_user_session_path %> para comentar: <% end %> + +
+ Visitas: <%= @site.visitas %> +

diff --git a/app/views/sites/show.html.erb~ b/app/views/sites/show.html.erb~ index b22daa2..9bfa6f9 100644 --- a/app/views/sites/show.html.erb~ +++ b/app/views/sites/show.html.erb~ @@ -1,5 +1,4 @@

-<<<<<<< HEAD

<%= @site.type.name if @site.type %>

<%= image_tag(@site.image_url, :class => 'site_image') %> @@ -25,6 +24,10 @@ <%= link_to "Ingrese", new_user_session_path %> para comentar: <% end %> + +
+ Visitas: <%= @site.visitas %> +

@@ -34,23 +37,3 @@ <%= link_to 'Back', sites_path %>

-======= - -

<%= @site.type.name if @site.type %>

- - <%= image_tag(@site.image.url, :class => 'site_image') %> - -

<%= @site.name %>

- -

<%=sanitize @site.description %>

- -

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

-
- -
- Visitas: <%= @site.visitas %> -
- -

-<% if @site.user == current_user %> <%= link_to 'Edit', edit_site_path(@site) %> | <% end %> <%= link_to 'Back', sites_path %> ->>>>>>> planet2012/master diff --git a/app/views/trips/index.html.erb b/app/views/trips/index.html.erb index 29cf0c1..86fbbf0 100644 --- a/app/views/trips/index.html.erb +++ b/app/views/trips/index.html.erb @@ -1,4 +1,3 @@ -<<<<<<< HEAD

Viajes

diff --git a/app/views/trips/index.html.erb~ b/app/views/trips/index.html.erb~ index b47edc9..86fbbf0 100644 --- a/app/views/trips/index.html.erb~ +++ b/app/views/trips/index.html.erb~ @@ -1,4 +1,3 @@ -<<<<<<< HEAD

Viajes

@@ -29,6 +28,3 @@

<%= link_to 'New Trip', new_trip_path %> -======= -

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 %> ->>>>>>> planet2012/master diff --git a/db/migrate/20120410143500_create_sites.rb b/db/migrate/20120410143500_create_sites.rb index 3938817..319d1b6 100644 --- a/db/migrate/20120410143500_create_sites.rb +++ b/db/migrate/20120410143500_create_sites.rb @@ -5,7 +5,10 @@ def change t.string :name t.text :description t.integer :type_id - t.string :image_url + t.string :image_url + t.float :longitud + t.float :latitud + t.integer :zoom t.timestamps end end diff --git a/db/migrate/20120410143500_create_sites.rb~ b/db/migrate/20120410143500_create_sites.rb~ index 3de0f84..54f079f 100644 --- a/db/migrate/20120410143500_create_sites.rb~ +++ b/db/migrate/20120410143500_create_sites.rb~ @@ -2,6 +2,13 @@ class CreateSites < ActiveRecord::Migration def change create_table :sites do |t| + t.string :name + t.text :description + t.integer :type_id + t.string :image_url + t.integer :longitud + t.integer :latitud + t.integer :zoom t.timestamps end end diff --git a/db/schema.rb b/db/schema.rb index 782b624..a69ce08 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -26,6 +26,9 @@ t.text "description" t.integer "type_id" t.string "image_url" + t.float "longitud" + t.float "latitud" + t.integer "zoom" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false t.string "image_file_name" diff --git a/db/seeds.rb~ b/db/seeds.rb~ index bf048dc..4289f57 100644 --- a/db/seeds.rb~ +++ b/db/seeds.rb~ @@ -9,7 +9,6 @@ Type.delete_all -<<<<<<< HEAD tm = Type.create( name: 'Monumento', description: 'Edificio de interes turistico o artistico') @@ -23,97 +22,39 @@ tr = Type.create( description: 'Lugar o resto de interes arquelogico') +Site.delete_all -User.delete_all - -user1 = User.create!( - name: 'Jose Perez', - email: 'jose.perez@gmail.com', - password: 'perez22', - password_confirmation: 'perez22') - -user2 = User.create!( - name: 'Javier Sedano', - email: 'javier.sedano@me.com', - password: 'sedano22', - password_confirmation: 'sedano22') -Site.delete_all -site1= Site.create!( - name: 'Pedriza', - description: 'Magnifico valle al norte de Madrid en el Macizo Central', - type_id: type2.id, - image_url: 'pedriza.png', - image: File.open(File.join(Rails.root, 'app', 'assets','images', 'pedriza.png'), "r")) -site1.user_id = user1.id ; site1.save - -site2 = Site.create!( +Site.create( name: 'Catedral de Florencia', description: 'Catedral de la ciudad de Florencia con la que se inicia el Renacimiento', - type_id: type1.id, - image_url: 'florencia.png', - image: File.open(File.join(Rails.root, 'app', 'assets','images', 'florencia.png'), "r")) -site2.user_id = user1.id ; site2.save + type_id: tm.id, + image_url: 'florencia.png') -site3 = Site.create!( +Site.create( name: 'Jardin de Lineo', - description: 'Jardin de la ciudad sueca de Uppsala donde el famoso naturalista tenia su coleccion de plantas', - type_id: type1.id, - image_url: 'arbol1.png', - image: File.open(File.join(Rails.root, 'app', 'assets','images', 'arbol1.png'), "r")) -site3.user_id = user2.id ; site3.save + description: 'Jardin de la ciudad sueca de Uppsala donde el famoso naturalista enia su coleccion de plantas', + type_id: tn.id, + image_url: 'arbol1.png') -site4 = Site.create!( +Site.create( name: 'Reichstag', description: 'Parlamento aleman en la ciudad de Berlin', - type_id: type2.id, - image_url: 'reichstag.png', - image: File.open(File.join(Rails.root, 'app', 'assets','images', 'reichstag.png'), "r")) -site4.user_id = user2.id ; site4.save + type_id: tm.id, + image_url: 'reichstag.png') -site5 = Site.create!( +Site.create( name: 'Pergamo', description: 'Puerta del mercado de la antigua ciudad griega de Pergamo del museo arquelogico de Berlin', - type_id: type3.id, - image_url: 'pergamo.png', - image: File.open(File.join(Rails.root, 'app', 'assets','images', 'pergamo.png'), "r")) -site5.user_id = user1.id ; site5.save - - - -Trip.delete_all - -trip1 = Trip.create!( - name: 'Viaje por Europa', - description: 'Viaje por capitales europeas', - date: '2012-04-12') -trip1.user_id = user1.id ; trip1.save - -trip2 = Trip.create!( - name: 'Sierra de Madrid', - description: 'Sua al Yelmo en la Pedriza', - date: '2012-05-18') -trip2.user_id = user2.id ; trip2.save - - -Visit.delete_all - -visit1 = Visit.create!( - hour: '10') -visit1.trip_id = trip2.id -visit1.site_id = site1.id ; visit1.save + type_id: tr.id, + image_url: 'pergamo.png') -visit2 = Visit.create!( - hour: '9') -visit2.trip_id = trip1.id -visit2.site_id = site5.id ; visit2.save -visit3 = Visit.create!( - hour: '16') -visit3.trip_id = trip1.id -visit3.site_id = site4.id ; visit3.save +# user_id esta protegido con "attr_protected" y debe inicializarse asi, +# Site.create(....) levantaria una excepcipón al intentar inicializarlo +Site.all.each { |obj| obj.user_id = 1 ; obj.save } From 50de81dad11f15cc2797c22b8cdcd11368849608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Tue, 17 Apr 2012 19:53:09 +0200 Subject: [PATCH 45/56] =?UTF-8?q?geolocalizaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/sites/_form.html.erb | 8 ++++++++ app/views/sites/_form.html.erb~ | 7 ++----- app/views/sites/_geo.html.erb | 24 ++++++++++++++++++++++ app/views/sites/_geo.html.erb~ | 36 +++++++++++++++++++++++++++++++++ app/views/sites/show.html.erb | 9 +++++++-- app/views/sites/show.html.erb~ | 8 ++++++-- 6 files changed, 83 insertions(+), 9 deletions(-) create mode 100644 app/views/sites/_geo.html.erb create mode 100644 app/views/sites/_geo.html.erb~ diff --git a/app/views/sites/_form.html.erb b/app/views/sites/_form.html.erb index 6c2c9c6..8e8d5db 100644 --- a/app/views/sites/_form.html.erb +++ b/app/views/sites/_form.html.erb @@ -19,6 +19,14 @@ <%= f.label :description %>
<%= f.text_area :description , :rows => 4 %>
+
+ <%= f.label :longitud %>
+ <%= f.text_field :longitud %> +
+
+ <%= f.label :latitud %>
+ <%= f.text_field :latitud %> +
<%= f.label :type_id %>
<%= f.collection_select(:type_id, Type.find(:all, :order => :name), :id, :name) %> diff --git a/app/views/sites/_form.html.erb~ b/app/views/sites/_form.html.erb~ index 0fe5aa7..6c2c9c6 100644 --- a/app/views/sites/_form.html.erb~ +++ b/app/views/sites/_form.html.erb~ @@ -24,13 +24,10 @@ <%= f.collection_select(:type_id, Type.find(:all, :order => :name), :id, :name) %>
-<<<<<<< HEAD + <%= f.label :image_url %>
<%= f.text_field :image_url %> -======= - <%= f.label :image %>
- <%= f.file_field :image %> ->>>>>>> planet2012/master +
<%= f.submit %> diff --git a/app/views/sites/_geo.html.erb b/app/views/sites/_geo.html.erb new file mode 100644 index 0000000..1e21f0d --- /dev/null +++ b/app/views/sites/_geo.html.erb @@ -0,0 +1,24 @@ + + +Ejemplo del API JavaScript de Google Maps + + + + +
+ +Elemento + + diff --git a/app/views/sites/_geo.html.erb~ b/app/views/sites/_geo.html.erb~ new file mode 100644 index 0000000..70f88bd --- /dev/null +++ b/app/views/sites/_geo.html.erb~ @@ -0,0 +1,36 @@ + + + + + + + + +
+
+ + diff --git a/app/views/sites/show.html.erb b/app/views/sites/show.html.erb index 9bfa6f9..8f128e5 100644 --- a/app/views/sites/show.html.erb +++ b/app/views/sites/show.html.erb @@ -6,10 +6,15 @@

<%=sanitize @site.description %>

Coordenadas: + Longitud <%= @site.longitud %> + Latitud: <%= @site.latitud %> + Zoom: <%= @site.zoom %> + +<%= render "geo"%>

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

-
<% if @site.comments!=[] %> Comentarios: @@ -35,5 +40,5 @@ <%= link_to 'Edit', edit_site_path(@site) %> | <% end %> <%= link_to 'Back', sites_path %>
- +
diff --git a/app/views/sites/show.html.erb~ b/app/views/sites/show.html.erb~ index 9bfa6f9..45635c3 100644 --- a/app/views/sites/show.html.erb~ +++ b/app/views/sites/show.html.erb~ @@ -6,10 +6,14 @@

<%=sanitize @site.description %>

Coordenadas: + Longitud <%= @site.longitud %> + Latitud: <%= @site.latitud %> + Zoom: <%= @site.zoom %> +

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

-
<% if @site.comments!=[] %> Comentarios: @@ -35,5 +39,5 @@ <%= link_to 'Edit', edit_site_path(@site) %> | <% end %> <%= link_to 'Back', sites_path %> - + From 95cbec29ba93f4b1584635cda8f5e43f0ed4f7cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Thu, 19 Apr 2012 18:15:47 +0200 Subject: [PATCH 46/56] geolocalizacion --- app/assets/stylesheets/planet.css | 5 +- app/assets/stylesheets/planet.css~ | 12 ++--- app/views/sites/_form.html.erb | 42 ++++++++++++++- app/views/sites/_form.html.erb~ | 49 +++++++++++++++++- app/views/sites/_geo.html.erb | 58 +++++++++++++-------- app/views/sites/_geo.html.erb~ | 60 ++++++++++++---------- app/views/sites/show.html.erb | 3 ++ app/views/sites/show.html.erb~ | 55 ++++++++++++++++++++ db/migrate/20120410143500_create_sites.rb~ | 4 +- 9 files changed, 225 insertions(+), 63 deletions(-) diff --git a/app/assets/stylesheets/planet.css b/app/assets/stylesheets/planet.css index 9178146..8f8680e 100644 --- a/app/assets/stylesheets/planet.css +++ b/app/assets/stylesheets/planet.css @@ -195,6 +195,9 @@ } #main .visitas { - text-indent: 70%; + text-indent: 60%; } +#main .geo{ + height: 500px; +} diff --git a/app/assets/stylesheets/planet.css~ b/app/assets/stylesheets/planet.css~ index 6c03fcf..77b3051 100644 --- a/app/assets/stylesheets/planet.css~ +++ b/app/assets/stylesheets/planet.css~ @@ -64,7 +64,6 @@ background: #88b0f8; } -<<<<<<< HEAD /* Styles for comments */ #comment_list table tr td { @@ -97,8 +96,6 @@ padding-left: 1em; } -======= ->>>>>>> planet2012/master /* START:mainlayout */ /* Styles for main page */ @@ -196,12 +193,11 @@ font-weight: bold; margin-right: 2em; } -<<<<<<< HEAD -======= - #main .visitas { - text-indent: 70%; + text-indent: 80%; } ->>>>>>> planet2012/master +#main .geo{ + height: 500px; +} diff --git a/app/views/sites/_form.html.erb b/app/views/sites/_form.html.erb index 8e8d5db..29dcaef 100644 --- a/app/views/sites/_form.html.erb +++ b/app/views/sites/_form.html.erb @@ -11,7 +11,7 @@ <% end %> -
+
<%= f.label :name %>
<%= f.text_field :name %>
@@ -21,12 +21,46 @@
<%= f.label :longitud %>
- <%= f.text_field :longitud %> + <%= f.text_field :longitud %>
<%= f.label :latitud %>
<%= f.text_field :latitud %>
+ + + + + + + +
+ +
+ + + + +
+ <%= f.label :zoom %>
+ <%= f.text_field :zoom %> +
+
<%= f.label :type_id %>
<%= f.collection_select(:type_id, Type.find(:all, :order => :name), :id, :name) %> @@ -40,4 +74,8 @@
<%= f.submit %>
+ + + + <% end %> diff --git a/app/views/sites/_form.html.erb~ b/app/views/sites/_form.html.erb~ index 6c2c9c6..9928666 100644 --- a/app/views/sites/_form.html.erb~ +++ b/app/views/sites/_form.html.erb~ @@ -11,7 +11,7 @@
<% end %> -
+
<%= f.label :name %>
<%= f.text_field :name %>
@@ -19,6 +19,49 @@ <%= f.label :description %>
<%= f.text_area :description , :rows => 4 %>
+
+ <%= f.label :longitud %>
+ <%= f.text_field :longitud %> +
+
+ <%= f.label :latitud %>
+ <%= f.text_field :latitud %> +
+ + + + + + + +
+ + +
+ + + + +
+ <%= f.label :zoom %>
+ <%= f.text_field :zoom %> +
+
<%= f.label :type_id %>
<%= f.collection_select(:type_id, Type.find(:all, :order => :name), :id, :name) %> @@ -32,4 +75,8 @@
<%= f.submit %>
+ + + + <% end %> diff --git a/app/views/sites/_geo.html.erb b/app/views/sites/_geo.html.erb index 1e21f0d..8114f86 100644 --- a/app/views/sites/_geo.html.erb +++ b/app/views/sites/_geo.html.erb @@ -1,24 +1,40 @@ - +
+ + + + + + - - - -
+ + + +
-Elemento - +
diff --git a/app/views/sites/_geo.html.erb~ b/app/views/sites/_geo.html.erb~ index 70f88bd..8114f86 100644 --- a/app/views/sites/_geo.html.erb~ +++ b/app/views/sites/_geo.html.erb~ @@ -1,36 +1,40 @@ + +
- - - - - + - - -
-
+ + + +
+
diff --git a/app/views/sites/show.html.erb b/app/views/sites/show.html.erb index 8f128e5..2d642be 100644 --- a/app/views/sites/show.html.erb +++ b/app/views/sites/show.html.erb @@ -11,7 +11,10 @@ Latitud: <%= @site.latitud %> Zoom: <%= @site.zoom %> +
<%= render "geo"%> +
+

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

diff --git a/app/views/sites/show.html.erb~ b/app/views/sites/show.html.erb~ index 45635c3..1e02d8c 100644 --- a/app/views/sites/show.html.erb~ +++ b/app/views/sites/show.html.erb~ @@ -11,6 +11,61 @@ Latitud: <%= @site.latitud %> Zoom: <%= @site.zoom %> +
+ + + + + + + + +
+
+ + +
+ + +
+

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

diff --git a/db/migrate/20120410143500_create_sites.rb~ b/db/migrate/20120410143500_create_sites.rb~ index 54f079f..2be9bd8 100644 --- a/db/migrate/20120410143500_create_sites.rb~ +++ b/db/migrate/20120410143500_create_sites.rb~ @@ -6,8 +6,8 @@ class CreateSites < ActiveRecord::Migration t.text :description t.integer :type_id t.string :image_url - t.integer :longitud - t.integer :latitud + t.double :longitud + t.double :latitud t.integer :zoom t.timestamps end From 6c57f547db402f75b6a698eb48c34e9adb60d749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Fri, 20 Apr 2012 01:58:38 +0200 Subject: [PATCH 47/56] Entrega 7 --- app/assets/images/teide.jpg | Bin 0 -> 17096 bytes app/assets/images/vilaflor.jpg | Bin 0 -> 23507 bytes app/views/sites/_form.html.erb | 30 +++++------ app/views/sites/_form.html.erb~ | 29 +++++------ app/views/sites/_geo.html.erb | 8 ++- app/views/sites/_geo.html.erb~ | 19 +++---- app/views/sites/show.html.erb | 1 + app/views/sites/show.html.erb~ | 53 +------------------ app/views/trips/_trip.html.erb | 6 ++- app/views/trips/_trip.html.erb~ | 80 +++++++++++++++++++++++++++++ app/views/trips/show.html.erb | 52 +++++++++++++++++++ app/views/trips/show.html.erb~ | 88 ++++++++++++++++++++++++-------- 12 files changed, 248 insertions(+), 118 deletions(-) create mode 100644 app/assets/images/teide.jpg create mode 100644 app/assets/images/vilaflor.jpg create mode 100644 app/views/trips/_trip.html.erb~ diff --git a/app/assets/images/teide.jpg b/app/assets/images/teide.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ca7aa9f189e787fb33b02eb2e7c49a03b5cfcbb0 GIT binary patch literal 17096 zcmb5Vby!@z6F<7Rl;ZBLi?g`9yK5;@+}))(i!2Vs-QB&#Deg|o;!?Cok<0u2UHSWF zvpLC3p3h9qlgXLPIeA-s+XY}M$|}eLU|?VX^6x*u+Xg@ifC!I(hyag>h=7QMgouoa ziHeGXf{Kfdfrd$dOGrq7i;quCMn^$RLPLs=PYI-?p=V%XW+I|sj4V`4+DdU2n+XrG=PD{qJqQz z4;mhUn#(mAM>4dqaSr#AM$>KZZ5@F2-VGKD4htX#`29D){;%A=lyw#5T2bWiT1B{Z z*vIT>lkE3O;m2=wMGgOvLO*7Q@Y-RXpHTS+6Gy9jv!h(Aib0$bC+qV_a#)fk0cjvk zX-hP}mptMYivX=X^|+0PMVMw4yvQkO5>cL6Bxend^OG{^4N)G<-d<@E9!#%0gAW^v zR2z$ue{bI#?-|+a4*O$1akS}nDEf90RLDMSAlYlYiksdeXWwg* zfBQg~UcDm_^p%k?^yQ-eWypW!y9^locj%&b&if_le{%khr~>rm|GE&gR)n|TFGz$r zZ8!0v)ik$_SQ<1)dJpYQO+9rUafd>>+f|F`V_ z%y|ieD=CcR~RxJL_d4B z!SXjFj*U3CqmnlKYC2s&(0o-O)m(vac7l2KY)5%^g5@tp94#b9jEp8uObd5EFI$H6 ztFAgfa?K}Kj9%G_8Lld*8+40t6_5|N_+&qRPQF%NP`Ur``b^%7VVT$5N06=@{84QS zLX)!aYl5^6*qMBo?|489qsr0I&H2(&8@(1;bT8s^AC&!=6Wllt zeWiL9nG41+w+j9u9xN)x9hHb{?>^c}Xw;Ry*4b&HW6EMmre?F8@-z2E&60=bcO%|k zrXb{Jg~jqj_N!o%zj1=z04+DK{egjG>^?SjZl|X&mp&koI73pFCn9VM9_J<* z%i!yV;(ANVk~+2-7FD+FLLmxb<(Rd3iPeWCOR_{TFD}`;IVFPW-U*Ai>=t_(>Rvoa zULZVmFQmprLI%tL`{c&&?{h&agEXhmv+Da8aexf6sxocodQ}}!&O!vfe7|9RuJ8W2 zAEyU2;p(rWE$al(N!D9+gppx-RL%{S{-1S|9I60K_!wT5=t|K8gy5`e=gz7FkKtzu zHmub|e1%Q1<{1!H7y}+_CP7XZY_@;Y|1<8{#L0_mMf3Q^qe9oI9LId zqZqMXtIcFgLC{Q9!|#b+nWE#&aE6L)QXs3Uj`+;*3ksEP5YmIh3X^}(R}-i9Bag&J zd$CC~t=N;`hwyOh^W#h{=!9I>8=&jm(AHTKZ{K?k2I;>{&)$3V3-^t(L^X956e7oUuq$l{TVSOkqrJWG8v-$ zND;Vd06pQY)2UX2BOaHg?$yit>-~U^)uNinJz22=JiI|FiEE#K03HUVWG;^imMRNx zddw32)slKA{ZM;b##Q(v$)zNez41dPAE-vgqF+s?kIC^;Fuw|Pzmp_?Tz{BYTc^IP zC)Dt}0mvgEr|wWC^ufRA);J>pIL-@&5@BLTR5vyG)+Tec%?oTI!2kq3atfdm1J4pE zsFtJxrbI>*P4lq04d_I^u#c4LZ-DehU0`X-BCP?`r%3_Gy8ppzBM#t0pzQQAz9>TD z`3AtZvaC{BGT66GTegLd@Q=Fu%wcJN6WPWY?s z6{Cr`qg}CZEcTo9nq6-)wB*|0`?KX1yHGDatx4rIEx2e*{OaeoWY??4h!6ucsvcsz z`C5Z;+kOh!Xd@i5{h`lWX9C4?(d+2IG<=2cX>{l)F z0Mb!I{gTh0e4Ss3n*rYkXp#q6y!iCG)wTuahAQ&}{`D&wf0`beQJ|KcjJFVSv2a&T z0I-rUK?Nf<=ozBX1=zRc|{-3RPt3Ym2VAtX}6=a9|o8^hKUp_Nc1*9Uwd zs*Y>%AvHE#u1q`&u-E<1N_0ZJKn6VTcB8BPpAo^lTa%TfmnhGgdXSk)DECOR0u+)#`iC$};!EsK3#V{NGI|}K(*9YWTUU}1h^kgVH^-(PC%Z#-TWGN2M z{Ld>%{ce8mDL4<@r}V;og=nTE+2QMp$@ggC+MXXq2{3U<&$nFVI&ZbyZ7JOu<3rzjy;1aa7+$XldsEK)dL43@854V4AXeZVud1lbz>R6A;*|>61PD%Fe?=VLewv@)+A>PyZ9Gry!4^&F1 zIVGJqOuvX}RDC!%6I&SlGq!~NV?#M}(2j-D9+mJ#I9x7#j6Cr1QIAq>@p}J+CfV?JJtVvq8KYG+ECHUlOZvbIidWlV4^`c2P(Sti3yfr%m(t%ji z+=A3yxbZu&hFQ7*gAtHLdSFCWGV-n&X>cL=E}8AKfp`zbPm0HuvHAi4$@b!-=t%XR zrdLIW)k6~zHNeScJ=~#wUhUs$R@)T6U^sa(V}{N5aS777Jx1}6&@nT6e7jDl2H@1& zZiR7})_8JyY$)q@+!xJ=T%&7&iAR#t>_{W@R44Fivl)=Sr1p~)e)JP>u*BraoaHA^ z)zSygJl+&4lf7)%!4R{GPS)oW`m&Pj zmVkroAH=T5-sA+&qoX(FZm2M*4Gj_$fr=(c{TUAn9pTsOHSo{UR#`;-ifTqC2R(v7R)<3jo5LZF^Jp*IX-$d2}pq0ADek^0OyD->)_i?w|6x zuREZPvNqW=pC*hyQ1^<6i+&`&s#bM;9w~wB_9AjOu${Gf@GU`*XfZ%HWqxy!h#aXM zlwMxI-YOJ3Q&Yy5-n){8sm!W@m^ea{N3_vI_&l`%V&gZ!iMGk;_n2bMF)Xq16Z-`D zyA?iOTe>wa>FysxRXM~ITs zH8L*^C+6?yI_U6lE~WDL$FW@?lZ*0fWzpgXe=p?M3hKY#lPKY`3Fam)m&?)qLCZnVY3PUsWg?h5qxmFUy0(HKlH7k9ur>tEFx;Hu~Mo zV(I+yoVa1IxO6$)u%MIbMT5M~C zSC+%WErz8=ARm^Z;528n>BFcM z0f?;@m5W{86R_=$vp<^FnvX28(@;C{!%#fw<*t;hkI96vZJiA(;*nqU{~}GSz-|*K z_q_EGIb;Ljy#d6Wj~@MA&-DCMdnw)kL=~>`;v0?_k))L`&-Ta1|CB*GgKO7!JYPyq z?7kA-KgqmwuBhCNPlsREzRJDJmq0h!}7r?wCqnol8WRmIx;}miLIH-(}1R;bEpYgm=O`tA-H{W@H8!TEn9kc$6E7+{kpm6^8?) zzDSE#_x(KAn^{{TRq+%*@}p@_$eii8Fc$}u@DEuxC;>9hZ-9!&l`>8ZFsYH-7manD z&$Q~K5Q9u??U&c>_4)yJO*>lfGb}Lf=B8kt!Nsc{o}{_O1oduN=2Gv1fMr9Zxh2dw zWv0}&o^ti>E9OQ7j+gU%ixXL?tt(Z6PJoMf{EeND*bI`9mU9X#tvWyChg%@mci|Pv z)1qu2ZWV$qKAq?Ixjs4fBR&%BpnU2+x#ZXNp8olJSbY$BFpK>7ba_u~lt}vu={n27Z6k~i5!MHVscRHa_0h+r={4#v1&>j{f z9aka4qma}D^i_HaF}es^=hdZv^G+K}vC1le(Q79xN}M`DIIn+ zyt?oN%Wh*WsDj4Jnm>G@g{K%_Ar>-#w^o>b-SZkmEAXYTyQ+(!bxmFU+EO!CZKojQ z+c-GinB;Y-0!E3%#^NKmzk34&TD7coTX`qaQfDsNMb(y;?Jn?fLTfe#IPm3j+^n7BIYITIFEC(L*wIRW^N(rn#sd_#Fs#xbL#Jhe`gkmajtjuHl)DWnnhNVIB$R`TT<{cV6H9B^)u## zoy>ZxI6{G_vy`qv={PAwwlK?bbi=Hqq4}ngoqB(_>YO6sB!Z&CiTX9@-O00#*&Pq# z()p0qO(&ClA-Yu418J%=H{N)CB`jub)pKmDcT;V}FH+%~L({*kc^S=CFdE)c{}*2C z{IRBsF2>t!H+*F9M_|4FCNo^oPfItG66Q^i2J64%!bXkjNv5UGGVU+mn$q|DRagG4 zAe{xaM&_KYYZy~Edm2DDBdFa2UQordiM2J)^vi(_{S(Z5VMjkj|FX4In?$f9*nY`L z+uX&vbE*=XKQ-*vR1}4A9f-#ZP--?WhD*LFzM`l&j|x4CM`#u|`X1qF^m6)w4&G~n zGv?pwq_K7#N8{6LBwqf`)4$CO{=!(9lFHefTH1-z>60I4WJeVq)$K|#* z>*J(g8}qL$v?V)Dt27%bN=2jA*4D;ckjAp5?k(-$7j-bNduDv#I{a%-6k_)=w^4BU4|ZUv0eBK19ZaOH(YWtn?G#%!NT4Q5J(e znUc7fGz(zlk`xYCpC0d)ouZOm3%Ri|9PpXv8+q~AQ}xJMAQFJw?RAP24f{x$WlCey z*bbN9BN17d_!2A_PCmOYe1FN;i&@gz>=e^9avzN7n*5X%P)96d{>dm1$WE;AP4RZC z8u<#y&^wU-X51m& zw--X64?-dLD4XTYVwNK&D=ekWLwwm8jw8--;7}rzn0OJ7YnFR5jkB_GZ(@Q?g4qrI z@)EQ&T@zSN-@Ci}rJxWc^ksZFlHd1k@&_R|r!PEwvgr!x;+S$k;FP~k zVtL|*)-COG>I!_q_T<~A zfLxL@W3w z#({duwB~c~nH`Wy7zR*(9<%hbgtJTbyn(uK0}fMZgl6nZlRW+L`g38CW@Zp}eKorR7=qrOw1+ zX#qmk&UMxyo$D6o^IAC#FBKmq`S=g|fTuUW^4%PdRhg{%96k4F9?x3#hiKpU_nXSa ze<{s7N!y=cOF90zbfZnb_Ms?1$B#nA?dh9dLBnT-I8ybIqY)wNCyJmQ3i&=Ca?w|x z#jR^TsbAw0ERWHRWI7QYn|wkPNH);d=c}2rD7;~aMaf!jSVwafRoSL!p2E%T+Rg2C z-?yXMy1DLFIWcs!EdmhT@!%n_77kHZV4ZMIlM&z}d<|N@XSOEZNcG@1S>xQmE6n)7 z#y{X(?x(&BUnCVMs$Tdk?P9G640LS#>wx5-)?D&tUTrQNs1-;oLpRsh3Y9`iQ$AHG{C1m*EAv!tX~SO zCGKYYj3i7hu=n~Bc;{57SYx28@$>_}tEpi2_EPMkMStld6U%o(BG@fGhtg|biWQX< z-6l@^ki@6Ry^eGEd`D$YC~9rN1zpD-&-=cN+;@@Y*M%USw(h#X=4ePDQt0bbKBPy3 zu_Xr2P@E}Yau)~sPd7oKix{@6nB%E!!>J8)#((fgtP2A*-Tpn+kU0jpV6&@wc%OQG zwUcc^6rm{MF)d@0;+HZ^FHyIj=sp*Nwwfi!Uqn;6dNyl-WuzG2RLphXw;RJB5_0uDUj_b&ugEo%#D zU}}kiU*TPLUJV_1n9Yq-_|SR8l|g}4w3vJ<_xEl-Y@H#IUR$kJJ48f&UCe*)wF_Iy z5iQ%Ci6pt5@u>|R=AnT7g{KCu4YlF|KCUtAB_c55@v(R$r=V>d9&@&*hB|N%^qNf) zgt(GIf=&BVMt)r~7UNmY@%t1&jkRFpLgzYnJ6U>@ytOA`9 z{cGCYM)wQ^y{S0wW9J^)zF;33q^jx-aNzDAZW%{(p3cT@em%0ddfV0);2Hjc6+=@z zblhuJj3z-$uMkdcc~0%)mVJX8VwreDw&1KVWy0Ys|d$1ZbY4T7<~rxVq=Dy1fd zXl`JbI}Km>#5sT>0fU&dV$UX@NZIM$KnpK@k(RHBxKONg1 zQtnWd3o_|ieXq|;&v6-kjF8V6{Tih$`uRix0@m?f;^`YegaF#HYf)6xl#O1(L=pr0 zCydecI`Ga#7_988&SCfAm2DR9%kUb=)FBv2$$Nm#xX8ejMyJ&mUuBc0Vw<^wLh*34 zErOnniAqQVj5ugrz`yu~r@lh)lE%W#)F2IYO>@%G%V*>F7`(dZrhC;y zOgEy)PxyFblj)y;!&wfbnb-$B<6NT{<_VUOujC5qC6yn?3!(Yq?DzA7yn^P*=$zmI z{q=!X3u8TmPJ%Z8y9x^ZIr=djq^X$jYq8VBWtEick#9p_0ELNj7pG6ttqHNMg#v8s zCqm=8fR{{+BTy75FvrlXI12C;ht!hUIP84jvkc}(y>ifWFWNP}3$(`5plBqG#&JVe zlE|qA(UyA1 z?NwIhD^oIVSV3py+YXPonp^=KL(ghWV&jid0>{HC3ES>Ds1`lLInC< zE%oa>BXig0l!~iHUQdzn5d+f1_uTU9dUj$PkKcnIh@HQhbx$Um_xF|3(41d>>HPWX zGg0G)N*PGA7Q$zoAUvljFL(E?Loju(WZ!!&+d567tdY1Sp>QPx)7Vn4z!_-_+q1)& z$F0*x<--WP3Rn2cW|e6En$zInAVDo-Gn;*5nb;ro+Dw8`a-Th$J5k}~X0;YaMG?*t zPFgDZnj2|1K-Wu0F9CGP2Mge$Y)RwTN_&ph7m!H4a=(z|(E$3bN@lTH6x#&KQ_=Bv zhdu?%{#-bdRGY);Nyb2PYFh#9z~!Ib@9D6~x$oxO$;;diW%|4tOs!o7~jmw!5RtAut5_6Julyyj(8T}z4e=(IjXH%VSKn8h_=oCgIW zw%Wxn1R(i|t03ZtmNrDnfbVKx1$x4 z$`WbO12Os;RQhH$gIQ<{g4vO5$$f%qH;mU4r3U|927(No#>=s74&wf``O?bjA`_)T zemoZ^RzK~u9@(cxd9lgZ(u`qq82iG8*{~45dq~ye>06iPq%uCE2ThRy{>~mmtgdmt zf1uV&8G}9gk+Ngwe~;saSdNf;k|_Jbnvr6bMU}5UE;vN;3UGEeoh6>W{+6r7jq)_1<5xE|7j-fWvqy#qrLEvC+qL5Dvqf>&?u`TtT;^6I zAc3xpl9EXSfDWqB9?SRv0-&W!mVOZJW6Tqg?c@jj z5FD|+HIrRi`E|1YIm;i3s8k%~YZmLb`t04fH^9gC!d@#->u9)I8Vv;w1FutKegqH4 zH+@N`pKe&*4kmj^Qd)@cJHi-Cdh0wz+0Z>;)9tKa78eKQ=O zC!vsLb?gxI%{7XBsokEB#Uf9<6>0E(FS%->2TA={DV$VQQ{kR|UO9v@hzUTNa+rT# z>uxJ1Rb!lT{pI{c$%d{8*|Lh})l5{>Gx9X0O81f{gx$SDd;m!oMw=Y@?@jd^fbI=Y zc<-8u{*A0A76$ZZPxaWqF~W^nHVmF7OxG0c2`NPUdj&Ga*Nb~B)2U*-3!4&%gO2(e@-l1LNV3~9Kr->Gi=d$d4O53JA0I|m+2 ztxYle{c=ms%0-0Lm$E@iELO7qQoS)MdT3a3{l#4>TK^nxtXSN!4e;#mAD9r?9I9EG zjE2l7o6~kZ^nq`NVSZ}q=H0-7P_M3mcx>H`P4%TW0LJvMLl<(N!!uAFQ`W)W>PprC zJ=0IO#OhAEHKf(|xSjp{Jnhb>&vHWXP6`MAEb@D`| z#u|->+02uB!+Lzjg{+(3SUqGP;=r*+_|jtu;&7RmO|5)M@k%hqqZER(T#=GW_(H{R z0JkwQX|H;@DMa#Zr#_xO@kV@dZ|J9=THKOy9?o%}kVf`51F|n+`rRvM7v85XZBKMA zbl1U)O8gDLhd8>iBSXzgpMk-EEXttlk;(|3@y-mX15k#K(uJTYkh3H?lrL~(E0h|K z@?Q?M>GKDE!!CeD{5=wd*a_Ltqdr@#PN_ z;qqj^=1dF<3qo5FRV}CR+0~S57@JXtu@yc7BRkQ4$B+_V@-OafjFoK@SaA3Sc{m-i zlz*{6z89Kgm5oNYt}%Lhe+=eas)8rS9Y60u_n|bO2YD^KYnS=g2m^%^*rte!dL9?I zxS)By`DM7q$HqS^3hn6@xlBk359-0AXTr8E|Imun5K*`aBCG}l$jC~#S{m*^!b{-d z<6UABwYyrYe$s5y9s;criyq$Z@;^fwRsXnBi=yCfNW5a?@mTG4j5GXI<}3+Lj>FwAqm`0KUECc`3=C>9z9^g%iF=h}ofR=CG>Xp6>Qa1SG1eogbVo?$M{VTZI0snQj%`1VAH$}Evjv%{yu1O*s-+h@ zu`**ibvI$OEb%Cx63qwZA&T*B8*O0%2C-Jgo5u|-%9RCMBEV3uRf^KK-t!lr zFTrTaFkG$9hiN5WGCpozWG+omgaT@;P6t8fqG6h@!I}z>+G9@o#0R#3ZI5XETzj zKG{y5lINVZjJ%E!O;rSx^q!;LkBZ)78`s_m{-;^OA~63~@V76natna6gXdTixf&=uCB zcRK+tVhdWi^b7xDm|;l@r3hQZy%S}dY$ zDKXnK`4j}?S`7%`34(edZDLa-vFB4}g0Ri;;^(ttjJbH}ocKtAO0Chw?tYDayMh4I zmT;=Y#-;?I>o1uP-FOBxUM!TemDPRZ$^%yG&*y_Bol8*SgKGN!F?yXY&91}YW>)f#gd2g!Sj|Qa8_5ivHG|5s8MN_O0F=o<)+)QLP zJY9+kxF9|^;yz!|A11^caapqDmvN}JT(s6!Yc#AW@1gf=42oY3zE|hjx5fV1zt*&F z^v}-BGu&j+=ViYSWOp6(xUnxR=i{TRvAPyk&%2^Dzrixv`l}h8goOyB{nN>vznp;BedJ$V71NslICu zM10VA4zjGke;C%s+_zF$)@)_<;P>tN6Le5ad2UNuD2p<#PpHK=f(R?0eDijf_v>-1}%)sYy_#Bbii2fBF=0zChFnlk>vv&MN8Klg` z{baeNt>`zZ;Wo`Xtsfp=JnDe0GFx9kp=CJnV2_xyc`<2%8k89E?KEm}Hyv&GliL?v z@McP9fI`9lM{VOkG|iie|>3bzvNoa#d$nF)>VP)?JE8VfCW%!^Kbz1v4P{5adS zqEDsE*BI|<=;cF&0%^@7(Y5l0zfWEK5q{lLbg}Uq-{Ep(=J=A>E*m?F7 z#z=bnRx14oj#|<&Tqfl>+zpq-chLeBPNt3(_!pK@hDgE5v2tT#GPUwya70!lIofYC zfAL1IEF1EGYu}<4VBnF4%$;@C)CaVPz2SJi`)3`Nwt3{; z)vdihg>6@)T;L!l6u)U+bSF{nUqJrmq4Hk97(IV#gZ4)yyL&xPsBf{hx0SqQF}SSc zUst56z;FsdFru+16$w=cW$mo`juJqdr2F@<8PLYwU5=0Mo=oL^S#W7;oE2M06et5E zFh!lzA>ERr%tQ07Neu%&h~m&234WfWVeYWu;w0*ee1CJzurf^i&?~fL{`yPxI_C1a zxu0t1n-td`{if|#kMQs3=A#1*C=`M^E@5lE^J4gX`^nejjN+Pq(9VLAzeF(Px4r?0 z+n7kSN<50|Z+}ERmW^$EG{Q$vT*)1{7WO-ZfOpTDQzgalZed}_R8fT=-+hYQ`avV% zuLna}Y>hk`1xVTVw~<)IvGbpx9zi=tkd74g9gEK%#q3IQ)9@*v(!BnLDxv)=CT~+taj3ZuNu;* z0{TLeKdmqC;lrH)`jEU40=a3QZVafi)>UqG2In<^u zcr0?9OiA-T>kOxAqWp#lLD9a5dLDrLJ>7kiYWXJ^UQFM%?5N{~55$m81@z^XaYSJX z{9eZo@Afftpm@4xJr;xYHTtwkB?Agk@G7oH@!5%DzVU4y;p!rT$4O)f(_C0 zU}vC8P=fgPZ&~t8Y%B(%`fG}ru6AZcV<4xs_V{FWL5Y@=!z=^+~ zw{FxmBR~ptv1L56U+pd0F86mHVps9w2Xwz}P3(Jb3e+FBEM;FE79!4VC0-Hh_DYr}trL<)q@5p2@?#FOr_4%5*d3h@N z>rZ+!*-Yj?G|Qy1X;)AFJk@&=7YHYN{=O3vm#LrG#~qIz>O>aD&d@Q)6BVZl3_1X- z@48o2f7OF_FZe~`A{sPttUYC?j($~)nCD{6ut5sjE-}D+{_W~EJU5T6u%T;RB9JR9 z{C8%jO#$w&1}tr9j1HRsyf4YaLC?c-qb&{ZR^nHyPg4}$LKTuj(LeQ@CKQ9y!?MYj z;n)Fowz_(k3axAPY)D2YV+1_1H$zNx3h)8a+-qzT9W5+;rKo~Aw$y=7sdMd zKD{p$9!*|F@euPrjt~7NIUV5blKt65e__6|eW`ptdu~e&Y{ClK`wuSci*tv6iJ!1l zfD|IcYaLmuB7EJXkUdEh3E`4apftH?TmwpD_n$ojumE1_^+6ivzaN&>$*iPc=(!70 zB{ZMcK2M}|Wftrd`LM-N_Qg<6Ka~f$p2Z954Rmsr1i801pxA{AHk7*!BCoZ*f7!04=(6tD_4TkBI5AP zREAL=`Jw5I>!0SFO#0>7byXtiUyw<|>t^JxL`A2S^z1hDIWGk%RPr2RtiQ{IP}W|gNP9%v}ZKg z!aGP}I72I|*@^pt6yHTiu35iv8$i=^ER}zHQySLd=-B;mH$kQO+jAmw3$|_DD9m52 zT!z2dy#oy^5c0}-iEq5tNnz=VW^Y`uFSk0nJjV1+&*rk3Zqtr9_@G$X6h$|9n!QX8 zh^CE;O=r=cWXg=D*BmrH4PjZ6mP836WXhMqk4qK{!^ssQw(E-l^$hb zRTIXrYcbP0s8fftQPwY3_<>(bHVG3_lOsk0M+W2`kO8Ug!h))i(VA$6aF5d=odnm|tSmLUJn0 z2O$T-WYXUgnMF^d4T>-lTV0ST+B)0U1?$mTap$4;B&|%2gK669Ea<4M9D5Mewv=w= z9~mZuTXGCl5?RQu%&<`DUu9q*+jawd2ufeuGXXHm>d}J^KqAO<6CCQh+9e8?&Cpd13&zu;I)#$_U&B-J!Q?OSLKMwXZzPaxEPV zx!qJ5yH@&8R24xbWck5*Qvg6giCVp)81KH8;ij!MIWsgOnPlcRheJR! zIdcQ(EH0Awji_Ddue&S5RuJaIEJMMi=qSY{}EfRvo)On4B6p z;jof;q&}gQF9fSQ>7e4K?b&}2Eg!$bJ-=jKQ$sVoG5znRSb4v29(LPR zxV^J4!}rs*DlQ6oI59QpPXiSer2ZW(7UKssX2OYhg&pHi?d*X!z>tU}iUrY@C`j43 z&Pxir1=5N+b+l0vC%W>d*3s6@s@2Oa(wMD)D&<;pl!nBBHm=6(zWR<=`1*Xx4d32VKEBD^Qjy-4HnenfROrL% zub3+j)O`1jqwv;nO%*rwA+u>~`79qd#TH)G{+h|(M{|aEpBZQ8gkpQpXnGfTuSyde zS3lx<UPTd(pi3CAV#G~olmQ3 zJ25i|01d7t*?zX|#UwCRbO zOd<4R1~h3Q2U+3>y$aWX!gi2zc;`q3Q8wBI1s(w+UmOG~ml2B+#UHs70G@!Hd%j|K zu-T=M7XNnZO2$7KL1~RUwW&cG#goRWyy*?+s_~Q%BTs_@5!GJR4^F3YAE%EtjvrS4 zfaz5&bGob*!!VBjgsBOI<-ohk{ayLs9bQTwi&Uf#ya`pMeghzreP>z7-8^PuvkpvE)Kr?Fq^~+zi4|h)~nKH+x`(YeS`U5M%L|X-)Z=u5pHMzc24%B31lkSFJH1*83vj;<9)s{0V|WN>r5pLXe~ zDI289H2KUaDypiT*-!+zp^b3L80Qw=(RQj4f%q(BOK5a=EiLzS0{@eJ`a>O zxxtVw`Ca`ET?t&>OwiW0`81l~yKHF%2#YRMh=VQ{+XsF}O?OswHKk@HR(4YNEXTD8u^mTGxy0PI`62i zP%Pp`H@dqv6nY`N_SfQCI@7o^xYV1eH36R0 z@4CoHka0aNB?$_IJvtUN_BHS&I~!}HE=?e$9o>`%J6w+r(!M5}ih2&NVDa`eE0JJZ zg+}>KkL&EAZDc}JAS!cB_J#=#KO6YFm?(Lm=mML;v$oG5DBswPQ-10JkTF(nBbkq5 zQgCU+~8$jEre6_RK>VGPsB_S@wtA zpP=WX9xMu-i7zN%T9+R4*+6*|A$^2?zviN*)gtozB{w&&F2^&8)h{pvHkt%u;CX_SWRIO$H|1{jQ$=<+XTbrY`10 zNlcPktM=gc7patllN1TAR8T-VWnR$E;_-s7GWy09yLt|TK>cSt+f7_@7VrKINw4jX zuHiFZ(i*JCAeiM{WxTrhs7>_?e-B2-$k!L$Lz<;Z#5ueENcv=^Br`jsR}F-rP)FB4 z{B+=oeV3)hRL0whw$o9-I5I zXd;)w0%LPy!<~^Z)cnqi#H(AxlrW~A3v!xT;P$=8g2jb+hE^Yrrfd55y^imVpm7tM zxV&qe5I$O@2sG`gBjun*y=uklzLj8bSfpyMaL)aj;mE+(y%VCZsQ~!wmC_kSGwkO=TT@wWrLQ?IENLO`D zvD%g!N6908+G{GLj$G-vC=xFlnz3f)Q!9NP3eQGbnB!y86Q7{Md-(ct>)5^gfXBzi|h=~$gdp~k&RCCpfs z07R-kys%BR0nf;`_&*$L zdz?bEM`R$2r1Ys`>G7-)z&mQF0I(=o_dewLI{9h0D`(f)7)GLtl20UmhoSIB&!e&GnhVkUl%S6QK z*cp+o>9Qmd$RuLQeK%1xyXRS#XkhJ>@v-5~?Mp0boyUF1oC{Ve4?OyN*T$EO8);b< z6d&4MLRH9?UA;K8v4Gr3$X%`tf(GMNRD5Whwxqm*Tb@mL$!syWmLQ+0ji2P}9356s wN2z5^8)8P1GNkeZa1CDrpM%b}u&m_UEw4$2MGn%=S%sgddHysxvz;IR+4O$Y5&!@I literal 0 HcmV?d00001 diff --git a/app/assets/images/vilaflor.jpg b/app/assets/images/vilaflor.jpg new file mode 100644 index 0000000000000000000000000000000000000000..83b2579a0e1be554b07f11b51cc7636b6834c975 GIT binary patch literal 23507 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 <%= form_for(@site) do |f| %> <% if @site.errors.any? %>
@@ -27,14 +28,18 @@ <%= f.label :latitud %>
<%= f.text_field :latitud %>
+
+ <%= f.label :zoom %>
+ <%= f.text_field :zoom %> +
- - +
- +
- - -
- <%= f.label :zoom %>
- <%= f.text_field :zoom %> -
-
<%= f.label :type_id %>
<%= f.collection_select(:type_id, Type.find(:all, :order => :name), :id, :name) %> @@ -74,7 +74,7 @@ function errorFunction(position) { alert('Error!'); }
<%= f.submit %>
- + diff --git a/app/views/sites/_form.html.erb~ b/app/views/sites/_form.html.erb~ index 9928666..999dea3 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,14 +28,18 @@ <%= f.label :latitud %>
<%= f.text_field :latitud %>
+
+ <%= f.label :zoom %>
+ <%= f.text_field :zoom %> +
- - +
- - +
- - -
- <%= f.label :zoom %>
- <%= f.text_field :zoom %> -
-
<%= f.label :type_id %>
<%= f.collection_select(:type_id, Type.find(:all, :order => :name), :id, :name) %> @@ -75,7 +74,7 @@ function errorFunction(position) { alert('Error!'); }
<%= f.submit %>
- + diff --git a/app/views/sites/_geo.html.erb b/app/views/sites/_geo.html.erb index 8114f86..410f97c 100644 --- a/app/views/sites/_geo.html.erb +++ b/app/views/sites/_geo.html.erb @@ -18,6 +18,10 @@ var latitude = <%= @site.latitud %> var longitude = <%= @site.longitud %> var zoo = <%= @site.zoom %> + var image = new google.maps.MarkerImage ("<%= asset_path(@site.image_url) %>", + new google.maps.Size(50,50), + new google.maps.Point(90,25), + new google.maps.Point(0,35)); var latlng = new google.maps.LatLng(latitude,longitude); var myOptions = { zoom: zoo, @@ -28,6 +32,7 @@ marker = new google.maps.Marker({ position: latlng, map: map, + icon: image }); } @@ -36,5 +41,6 @@
-
+ + diff --git a/app/views/sites/_geo.html.erb~ b/app/views/sites/_geo.html.erb~ index 8114f86..33fa077 100644 --- a/app/views/sites/_geo.html.erb~ +++ b/app/views/sites/_geo.html.erb~ @@ -13,28 +13,21 @@
-
+ + diff --git a/app/views/sites/show.html.erb b/app/views/sites/show.html.erb index 2d642be..ced2f1f 100644 --- a/app/views/sites/show.html.erb +++ b/app/views/sites/show.html.erb @@ -44,4 +44,5 @@ <% end %> <%= link_to 'Back', sites_path %>
+ diff --git a/app/views/sites/show.html.erb~ b/app/views/sites/show.html.erb~ index 1e02d8c..2d642be 100644 --- a/app/views/sites/show.html.erb~ +++ b/app/views/sites/show.html.erb~ @@ -12,58 +12,7 @@ Zoom: <%= @site.zoom %>
- - - - - - - - -
-
- - -
- - +<%= render "geo"%>

Autor: diff --git a/app/views/trips/_trip.html.erb b/app/views/trips/_trip.html.erb index 2d69c99..ee8d02f 100644 --- a/app/views/trips/_trip.html.erb +++ b/app/views/trips/_trip.html.erb @@ -1,9 +1,10 @@ +

<% trip.visits.order(:hour).each do |visit| %>
- <%= link_to image_tag(visit.site.image.url, :class => 'list_image'), visit.site %> + <%= link_to image_tag(visit.site.image_url, :class => 'list_image'), visit.site %> @@ -27,3 +28,6 @@
+ + + diff --git a/app/views/trips/_trip.html.erb~ b/app/views/trips/_trip.html.erb~ new file mode 100644 index 0000000..22e0ea0 --- /dev/null +++ b/app/views/trips/_trip.html.erb~ @@ -0,0 +1,80 @@ + +
+ + + + + + + +
+ + +
+ + <% trip.visits.order(:hour).each do |visit| %> + + + + + + + + <% end %> +
+ <%= link_to image_tag(visit.site.image_url, :class => 'list_image'), visit.site %> + +
+
<%= visit.hour.to_s + 'h: ' %> + <%=link_to(visit.site.name, visit.site) %>
+
<%= truncate(strip_tags(visit.site.description), + :length => 80) %>
+
+
+ <%= link_to 'Show', visit.site %>
+ <%= link_to 'Destroy', visit, + :confirm => 'Are you sure?', + :method => :delete if trip.user == current_user %> + +
+
+ + + + diff --git a/app/views/trips/show.html.erb b/app/views/trips/show.html.erb index dfca706..9c537cb 100644 --- a/app/views/trips/show.html.erb +++ b/app/views/trips/show.html.erb @@ -1,3 +1,4 @@ +

Name: <%= @trip.name %> @@ -18,6 +19,55 @@ <%= simple_format @trip.description %>

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

Sitios a visitar

@@ -45,3 +95,5 @@ <%= link_to 'Edit', edit_trip_path(@trip) %> | <% end %> <%= link_to 'Back', trips_path %> + + diff --git a/app/views/trips/show.html.erb~ b/app/views/trips/show.html.erb~ index 705e497..c9f75e0 100644 --- a/app/views/trips/show.html.erb~ +++ b/app/views/trips/show.html.erb~ @@ -1,38 +1,80 @@ -<<<<<<< HEAD +

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

+

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

+

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

-

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

-<% if @trip.user == current_user %> -<%= link_to 'Edit', edit_trip_path(@trip) %> | + +

+ 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 %> + <% if @trip.user == current_user %> <%= form_for(@visit, :remote => true) do |f| %> <%= f.number_field :trip_id, :value => @trip.id, :hidden => true %> @@ -48,6 +90,10 @@
- <% if @trip.user == current_user %> <%= link_to 'Edit', edit_trip_path(@trip) %> | <% end %> <%= link_to 'Back', trips_path %> - ->>>>>>> planet2012/master + +<% if @trip.user == current_user %> + <%= link_to 'Edit', edit_trip_path(@trip) %> | +<% end %> +<%= link_to 'Back', trips_path %> + + From 8ff4e48149b36e06efd47e9b181999c0a47fe729 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Fri, 20 Apr 2012 02:17:28 +0200 Subject: [PATCH 48/56] Cambios --- test/fixtures/trips.yml~ | 29 +++++++++++++++++++++++++++++ test/fixtures/users.yml~ | 28 ++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 test/fixtures/trips.yml~ create mode 100644 test/fixtures/users.yml~ diff --git a/test/fixtures/trips.yml~ b/test/fixtures/trips.yml~ new file mode 100644 index 0000000..fa133b9 --- /dev/null +++ b/test/fixtures/trips.yml~ @@ -0,0 +1,29 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +<<<<<<< HEAD +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value +======= +one: + name: MyString + description: MyText + date: 2012-04-09 + user: one + +two: + name: YourString + description: YourText + date: 2012-04-09 +<<<<<<< HEAD + user: one +>>>>>>> planet2012/master +======= + user: two +>>>>>>> planet2012/master diff --git a/test/fixtures/users.yml~ b/test/fixtures/users.yml~ new file mode 100644 index 0000000..850e5a3 --- /dev/null +++ b/test/fixtures/users.yml~ @@ -0,0 +1,28 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +<<<<<<< HEAD +one: {} +# column: value +# +two: {} +======= +one: + name: Jose Perez + email: jose.perez@gmail.com + encrypted_password: perez22222 +# column: value +# +two: + name: Jose Perez + email: jose.perez@me.com +<<<<<<< HEAD + encrypted_password: perez333333333333333333333333333333333 +>>>>>>> planet2012/master +======= + encrypted_password: perez33333 +>>>>>>> planet2012/master +# column: value From 22f16359bc7a8864696f2c1d9cb51274b9977fec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20Gonz=C3=A1lez?= Date: Fri, 20 Apr 2012 11:29:33 +0200 Subject: [PATCH 49/56] Entrega 7 --- app/controllers/planet_controller.rb | 3 - app/views/layouts/application.html.erb | 24 ++----- db/seeds.rb | 99 ++++++++++++++++++++------ 3 files changed, 82 insertions(+), 44 deletions(-) diff --git a/app/controllers/planet_controller.rb b/app/controllers/planet_controller.rb index d4bc582..a8636bd 100644 --- a/app/controllers/planet_controller.rb +++ b/app/controllers/planet_controller.rb @@ -29,8 +29,5 @@ def contact # Método que define una acción vacía del controlador def ejemplo end - - def author - end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 52cd61b..e4c9e36 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -6,11 +6,7 @@ <%= javascript_include_tag "application" %> <%= csrf_meta_tags %> - + @@ -18,30 +14,22 @@ -
- +
diff --git a/app/views/sites/show.html.erb~ b/app/views/sites/show.html.erb~ index 2d642be..1161ea0 100644 --- a/app/views/sites/show.html.erb~ +++ b/app/views/sites/show.html.erb~ @@ -10,38 +10,52 @@ Longitud <%= @site.longitud %> Latitud: <%= @site.latitud %> Zoom: <%= @site.zoom %> +
-
-<%= render "geo"%> -
- -

Autor: +

<%= @site.type.name if @site.type %>

+<%= image_tag(@site.image_url, :class => 'site_image') %> +

<%= @site.name %>

+ +

<%=sanitize @site.description %>

Coordenadas: + Longitud <%= @site.longitud %> + Latitud: <%= @site.latitud %> + Zoom: <%= @site.zoom %> + +
<%= render "geo"%>
+ +

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

<% if @site.comments!=[] %> Comentarios: - <%= render @site.comments %>

-

Añada su comentario: -<% if current_user %> +

Añada su comentario: +<% if current_user %> <%= render "comments/form" %>

- <%= link_to "Ingrese", new_user_session_path %> para comentar: +<% else %> +<%= link_to "Ingrese", new_user_session_path %> para comentar: -<% end %> +<% end %>
Visitas: <%= @site.visitas %>
- + +

+ Incluido en <%=@site.visits.length%> viaje<%if @site.visits.length != 1%>s<%end%> +

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

-
+
+ diff --git a/app/views/trips/_trip.html.erb b/app/views/trips/_trip.html.erb index ee8d02f..42c7ef5 100644 --- a/app/views/trips/_trip.html.erb +++ b/app/views/trips/_trip.html.erb @@ -1,33 +1,35 @@ -
- - <% trip.visits.order(:hour).each do |visit| %> - -
+ + <% trip.visits.order(:hour).each do |visit| %> + + + - - - + + <% end %> -
<%= link_to image_tag(visit.site.image_url, :class => 'list_image'), visit.site %> - -
+
+
<%= visit.hour.to_s + 'h: ' %> - <%=link_to(visit.site.name, visit.site) %>
+ <%=link_to(visit.site.name, visit.site) %>
<%= truncate(strip_tags(visit.site.description), :length => 80) %>
-
+
+ <%= link_to 'Show', visit.site %>
- <%= link_to 'Destroy', visit, + <%= link_to 'Destroy', visit, :confirm => 'Are you sure?', - :method => :delete if trip.user == current_user %> + :method => :delete if trip.user == current_user %> -
+
+ + + diff --git a/app/views/trips/_trip.html.erb~ b/app/views/trips/_trip.html.erb~ index 22e0ea0..42c7ef5 100644 --- a/app/views/trips/_trip.html.erb~ +++ b/app/views/trips/_trip.html.erb~ @@ -1,80 +1,35 @@ - -
- - - - - - - -
- -
- - <% trip.visits.order(:hour).each do |visit| %> - -
+ + <% trip.visits.order(:hour).each do |visit| %> + + + - - - + + <% end %> -
<%= link_to image_tag(visit.site.image_url, :class => 'list_image'), visit.site %> - -
+
+
<%= visit.hour.to_s + 'h: ' %> - <%=link_to(visit.site.name, visit.site) %>
+ <%=link_to(visit.site.name, visit.site) %>
<%= truncate(strip_tags(visit.site.description), :length => 80) %>
-
+
+ <%= link_to 'Show', visit.site %>
- <%= link_to 'Destroy', visit, + <%= link_to 'Destroy', visit, :confirm => 'Are you sure?', - :method => :delete if trip.user == current_user %> + :method => :delete if trip.user == current_user %> -
+
- + + + + diff --git a/app/views/trips/show.html.erb b/app/views/trips/show.html.erb index 9c537cb..00e8a94 100644 --- a/app/views/trips/show.html.erb +++ b/app/views/trips/show.html.erb @@ -10,7 +10,7 @@

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

@@ -18,9 +18,6 @@ Description: <%= simple_format @trip.description %>

- - -