2011-08-25 5 views
5

Sé que esta es una pregunta trivial. Pero busqué en todo google pero no puedo encontrar una respuesta simple a esta pregunta.Ruby on Rails: cómo imprimir una cadena y dónde se muestra en?

Básicamente tengo una línea que dice <%= link_to 'Run it', :method => 'doIt' %> en la vista, a continuación, en el controlador correspondiente, tengo el método doIt de la siguiente manera:

def doIt 
    puts "Just do it" 
end 

sólo quiero comprobar que si hago clic en Ejecutar ella, dará salida a la cadena "Just do it". Ejecuté esto en localhost y no hay errores, pero no puedo encontrar el resultado "Just do it" en ninguna parte. No se muestra en la consola de rieles ni en el registro del servidor de rieles. Solo quiero saber dónde pone la cadena de salida, dónde encontrarla?


Ronda 2: Así que esto es lo que he intentado ....

Agregado esta línea en el index.html.erb (que es la raíz)

<%= link_to 'Run it', :method => 'do_it' %> 

y en la url, es básicamente http://localhost:3000/ (desde que enruto el índice de control # como root)

La pantalla es solo un subrayado 'Ejecutar' que enlaza con 'do_it 'método en el controlador.

En el controlador, incluyo este método

def do_it 
    logger.debug "Just do it" 
end 

cuando hago clic en 'Ejecutar', el cambio url para http://localhost:3000/gollum_starters?method=do_it y en el development.log, se escribe el siguiente en él:

Started GET "/gollum_starters?method=do_it" for 127.0.0.1 at 2011-08-25 15:27:49 -0700 
    Processing by GollumStartersController#index as HTML 
    Parameters: {"method"=>"do_it"} 
    [1m[35mGollumStarter Load (0.3ms)[0m SELECT "gollum_starters".* FROM "gollum_starters" 
Rendered gollum_starters/index.html.erb within layouts/application (3.6ms) 
Completed 200 OK in 16ms (Views: 7.7ms | ActiveRecord: 0.3ms) 

Además, probé todo el logger.error/info/fatal/etc ... y Rails.logger.error/info/fatal/etc, todos no imprimieron la línea "Just do it" en el desarrollo registro

@Paul: no toqué la carpeta o el archivo de entorno, supongo que de forma predeterminada cuando se crea una nueva aplicación de rieles, ¿está en desarrollo?

@Maz: Sí, tienes razón, solo estoy tratando de probar si se llama al método do_it. Para hacer eso, solo quiero imprimir algo en el controlador. No puedo pensar en ninguna manera más simple que simplemente imprimir una cadena, pero este problema me está haciendo miserable. Solo estoy usando textmate, no IDE.


Ronda 3:

@ Pablo THX mucho, pero me encontré con error

Mis rutas de archivos es ahora:

resources :gollum_starters 

root :to => "gollum_starters#index" 

match 'gollum_starters/do_it' => 'gollum_starters#do_it', :as => 'do_it' 

Mi index.html.erb es ahora :

<%= link_to "Do it", do_it_path %> 

Mi gollum_starters_controller.rb

def do_it 
    logger.debug 'Just do it' 
end 

estoy recibiendo este error:

Couldn't find GollumStarter with ID=do_it

el error está en que aquí, 2ª línea:

def show 
    @gollum_starter = GollumStarter.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @gollum_starter } 
    end 
    end 

Me pregunto ¿por qué ruta para mostrar? Cuando hago clic en do_it, en realidad va a localhost: 3000/gollum_starters/do_it que es correcto, pero aparentemente el error apunta al método show?


Ronda 4:

@ Pablo, i transferido recursos: gollum_starters abajo:

root :to => "gollum_starters#index" 

match 'gollum_starters/do_it' => 'gollum_starters#do_it', :as => 'do_it' 

resources :gollum_starters 

pero tiene este error (OMG quiero suicidarme),

Template is missing

Missing template gollum_starters/do_it with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html], :locale=>[:en, :en]} in view paths "~/project_name/app/views"

:/

---------- respuesta a la Ronda 4 ------------

Básicamente como explica el error, no hay ninguna plantilla (es decir, una página web) para mostrar por lo tanto error lanzado. La solución es agregar un redirect_to, en este caso redirijo a root_url.

def do_it 
    logger.debug 'Just do it' 
    redirect_to(root_url) 
end 

Todo funciona ahora, "Simplemente hágalo" finalmente se emite a development.log y la consola del servidor rails.

Gracias Maz, Paul y Andrew por ayudarme. Aprender mucho.

+0

John, consulte la explicación que se agrega a continuación. Te estás perdiendo la idea central de REST en Rails, y serás mucho más feliz con los rieles si lo entiendes. Buena suerte :) – Andrew

+0

Yup mirándolo, gracias por la explicación detallada –

Respuesta

4

Eso link_to no hace lo que piensa que hace el valor de :method se refiere a los HTTP verbos.

Tomado de la documentación para ActionView::Helpers::UrlHelper

:method - Symbol of HTTP verb. Supported verbs are :post, :get, :delete and :put. By default it will be :post.

Usted tendría que definir una ruta en el archivo de routes.rb que utiliza el método de

# The order of routes is important as the first matched will be used 
# therefore the match needs to be above 'resources :controller' 
match 'controller/do_it' => 'controller#do_it', :as => 'do_it' 

resources :gollum_starters # <--- This needs to be below the match or this will catch first 
  • El controller/do_it es la ruta que se ajustará
  • El controller#do_it es el controlador seguido de la acción que se utilizará (se parated por #)
  • El valor para :as crea la trayectoria do_it_path que se puede utilizar en su link_to

Su link_to puede ser algo como

<%= link_to "Do it", do_it_path %> 

Y para completar el ciclo de vida de un pedido tendrá que agregar un view para representarse

app/views/gollum_startes/do_it.html.erb # <-- Add file 

Resumen Hacer todo esto crea un lío solo para imprimir algo en los registros, pero debería ayudarlo a comprender todo el ciclo de vida un poco mejor ahora. Además, esta respuesta sirve como un documento para ayudarlo a rebobinar este desastre.

+0

Hola Paul, esto tiene sentido, pero tengo un error, mira mi publicación en la ronda 3 –

+0

Ver la respuesta actualizada –

+0

Lamento molestarte. Obtuve otro error de plantilla faltante, vea la Ronda 4. –

-1

que desea utilizar el mecanismo de registro de rieles:

http://guides.rubyonrails.org/debugging_rails_applications.html#sending-messages

Esto significa que incluso si no ejecuta el servidor utilizando la salida rails s todavía irá al lugar correcto.

+0

así que básicamente 'puts' es específico de ruby. No funciona a pesar de que lo uso en un archivo .rb? –

+1

no, pone envía salida a STDOUT, la mayoría de las veces STDOUT es la terminal, pero a veces no lo es. En este caso no es así. puts still works, simplemente no genera contenido en el lugar donde desea que se emita. El texto que se desplaza en la consola también se escribe en el registro de desarrollo. Es a este registro, no a la terminal, en la que desea escribir. – Maz

+0

Thx para la explicación. He probado todo este registrador (debug | info | warn | error | fatal) y verifico el registro de desarrollo, pero aún no escribe en el registro. Incluso hice ctrl-shift-f en la carpeta de mi proyecto y no puedo encontrarlo registrado en ninguna parte excepto en el controlador donde lo hice logger.debug "Just do it". Así que, básicamente, hago clic en "Ejecutar" y se llama al método do_it (cambiado de doIt a seguir la convención de rieles), y lo hice logger.debug/info/etc ... pero verifico el registro de desarrollo y "solo hazlo" "no está escrito en eso. –

2

No entiende qué significa "método" en el contexto de un enlace.

El "método" aquí se refiere al request method, lo que significa el tipo de solicitud que le pide al navegador que haga. Desde la perspectiva de una aplicación RESTful como Rails, hay cuatro tipos de solicitud relevantes: GET, POST, PUT y DELETE. Estos tipos de solicitud afectan la forma en que el controlador responde a una solicitud.

  • GET => INDICE o mostrar
  • post => Crear
  • PUT => ACTUALIZACIÓN
  • delete => Destrozado

Hay otras dos acciones carriles "estándar", NUEVOS y EDITAR. Estas son solicitudes GET para presentar una interfaz al usuario. NEW le da un formulario para POST (CREAR) un nuevo objeto, y EDIT le da un formulario para PONER (ACTUALIZAR) y uno existente.

Consulte the rails guide para obtener más información sobre cómo los verbos HTTP se relacionan con las operaciones CRUD.

Lo importante y básico para comprender es que los enlaces, por defecto, son solicitudes GET, y los formularios, por defecto, son solicitudes POST.

Por lo tanto, cuando el enlace es el siguiente:

<%= link_to 'Run it', :method => 'do_it' %> 

... es falso. No existe un método HTTP como "do_it", por lo que no está activando nada. Como no existe tal método, Rails en realidad lo pasa como un parámetro de la URL.Por lo tanto, si hace clic en que debería ver su barra de direcciones ahora dice ?method=do_it al final.

Existen varios problemas con lo que intenta hacer. Antes que nada, the link_to helper espera al menos dos argumentos: 1, el texto para el enlace, y 2 el HREF para el enlace. Entonces, realmente necesita usar:

link_to 'Run it', url 

En segundo lugar, necesita saber qué URL pasar para obtener su acción de controlador.

Familiarícese con la siguiente convención de raíles: Cuando se refiera a una acción del controlador, puede abreviar utilizando el formulario: controller_name#controller_action. p.ej. pages#show o articles#index.

Asumiendo que su controlador se llama ExamplesController, se puede activar manualmente las siete acciones del controlador estándar de la siguiente manera:

link_to 'examples#index', '/examples' 
link_to 'examples#show', '/examples/123' # 123 is the id of a specific example 
link_to 'examples#new', '/examples/new' 
link_to 'examples#create', '/examples', :method => :post 
link_to 'examples#edit', '/examples/123/edit' 
link_to 'examples#update', '/examples/123', :method => :put 
link_to 'examples#destroy', '/examples/123', :method => :delete 

Tenga en cuenta que en el anterior, índice, SHOW, NUEVA y editar son todas las peticiones GET. Puede especificar :method => :get pero eso es innecesario

Para abstraer esto y ocuparse de asignar la ID cuando sea necesario, Rails proporciona path helpers.

Así, para repetir lo anterior usando los ayudantes de ruta puede usar:

link_to 'examples#index', examples_path 
link_to 'examples#show', example_path(@example) 
link_to 'examples#new', new_example_path 
link_to 'examples#create', examples_path, :method => :post 
link_to 'examples#edit', edit_example_path(@example) 
link_to 'examples#update', example_path(@example), :method => :put 
link_to 'examples#destroy', example_path(@example), :method => :delete 

Ahora, se obtiene estos ayudantes de ruta desde el router, y que se definen en el archivo de routes.rb. Dentro de ese archivo si define:

resources :examples 

... entonces obtendrá todos los path_helpers anteriores.

Si está usando un controlador RESTful normal y desea agregar una acción personalizada, entonces necesita tomar una decisión: ¿opera la acción en todo el conjunto de objetos manejados por ese controlador (como índice) o solo una único específico (como show). La razón por la que esto es importante es porque le dice al enrutador si la nueva acción que está definiendo necesita recibir un ID de registro como parte de la solicitud.

Si desea actuar en toda la colección de objetos, se define:

resources :examples do 
    collection do 
    get 'do_it' 
    end 
end 

Si desea actuar sobre un solo miembro de la colección se define:

resources :examples do 
    member do 
    get 'do_it' 
    end 
end 

Dónde Escribí 'obtener' en los ejemplos anteriores, puedes usar cualquiera de los cuatro verbos: GET es normalmente lo que haces si quieres mostrar una página, y POST es normalmente lo que usaría si estás enviando un formulario. También puede escribir esta forma abreviada de este modo:

resources :examples do 
    get 'do_it', :on => :collection 
    post 'something', :on => :member 
end 

Para más información sobre la definición de las acciones del controlador personalizado, consulte the rails guide.

Ahora que ha definido una ruta, debe ejecutar rake routes en el terminal para ver el nombre del nuevo asistente de ruta.Supongamos que ha agregado do_it como método de recopilación, su asistente de ruta sería: do_it_examples_path.

Ahora bien, de vuelta a su enlace, si se pone:

<%= link_to 'Do it.', do_it_examples_path %> 

... entonces daría lugar a la acción do_it. Cuando se desencadena la acción, su puts normalmente debería mostrarse en el registro del servidor (suponiendo que está ejecutando rails en una ventana de terminal, debería verlo justo después de started GET on examples#do_it ...).

Ahora, en el navegador obtendría un error de plantilla faltante ya que una solicitud GET esperará generar una vista, pero ese es un tema para otra pregunta. Básicamente, ahora debes entender cuáles son las acciones del controlador, cómo llegar a ellas. Si desea obtener más información sobre qué hacer con la acción de su controlador, see the guide :)

Espero que comprenda lo que está sucediendo ahora. No dude en hacer preguntas.