rutas relativas para acceder a los activos de rieles

¡Estoy atascado! xD He estado trabajando en un proyecto de Rails y tengo problemas para acceder a mis activos usando rutas relativas. Un amigo mío está trabajando en el lado html/css mientras yo manejo los controladores y los modelos. Mi amigo me dio recientemente un lote de archivos estructurados de la siguiente manera:

app/assets/images/*.jpg
app/assets/stylesheets/*.css
app/assets/javascripts/*.js
app/assets/fonts/*.* (+some more css files in here)

Dentro de mi directorio app/views/layouts, tengo un diseño llamado final.html.erb que se usa para toda mi aplicación web. También tengo 1 página (contenido del cuerpo html) que estoy tratando de representar con este diseño en app/views/pages llamado final_page.html.erb... el enrutamiento necesario está en su lugar para que la página se cargue; sin embargo, solo carga el contexto de final_page.html.erb (sin imágenes, estilos ni fuentes). Cuando voy a la consola y escribo "servidor de rieles" y visito localhost: 3000, la página aparece ... desnuda jajaja. La consola emite lo siguiente:


Started GET "/" for 127.0.0.1 at 2012-07-28 21:15:02 -0700
Connecting to database specified by database.yml
Processing by PagesController#final_page as HTML
  Rendered pages/final_page.html.erb within layouts/final (8.4ms)
Completed 200 OK in 82ms (Views: 81.0ms | ActiveRecord: 0.0ms)


Started GET "/assets/stylesheets/style.css" for 127.0.0.1 at 2012-07-28 21:15:04 -0700

ActionController::RoutingError (No route matches [GET] "/assets/stylesheets/style.css"):
  actionpack (3.2.6) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  actionpack (3.2.6) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
  railties (3.2.6) lib/rails/rack/logger.rb:26:in `call_app'
  railties (3.2.6) lib/rails/rack/logger.rb:16:in `call'
  actionpack (3.2.6) lib/action_dispatch/middleware/request_id.rb:22:in `call'
  rack (1.4.1) lib/rack/methodoverride.rb:21:in `call'
  rack (1.4.1) lib/rack/runtime.rb:17:in `call'
  activesupport (3.2.6) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
  rack (1.4.1) lib/rack/lock.rb:15:in `call'
  actionpack (3.2.6) lib/action_dispatch/middleware/static.rb:62:in `call'
  railties (3.2.6) lib/rails/engine.rb:479:in `call'
  railties (3.2.6) lib/rails/application.rb:220:in `call'
  rack (1.4.1) lib/rack/content_length.rb:14:in `call'
  railties (3.2.6) lib/rails/rack/log_tailer.rb:17:in `call'
  rack (1.4.1) lib/rack/handler/webrick.rb:59:in `service'
  /usr/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
  /usr/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
  /usr/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'


  Rendered /var/lib/gems/1.9.1/gems/actionpack-3.2.6/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (2.0ms)

Creo que el problema es que estoy tratando de acceder a los archivos usando rutas relativas. Mi archivo de diseño se ve así:

<!doctype html>
<html class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="viewport" content="width=device-width">
<title>:: Final ::</title>
<link rel="stylesheet" type="text/css" href="../../assets/stylesheets/style.css">
<link href="../../assets/stylesheets/desktop.css" rel="stylesheet" type="text/css" media="only screen and (min-width:769px) and (max-width:1000px)">
<script src="../../assets/javascripts/modernizr.js" type="text/javascript"></script>
</head>
<body>
  <%= yield %>
</body>
</html>

Además, dentro del cuerpo de mi archivo final_page.html.erb, también trato de acceder a las imágenes usando rutas relativas... así:

<img src="../../assets/images/mainImg.jpg" alt="img"> 

Mi amigo escribió la mayor parte de este html y no tiene experiencia trabajando con rieles. Decidí cambiar las solicitudes de activos así:

De:

<link rel="stylesheet" type="text/css" href="../../assets/stylesheets/style.css">

A:

<%= stylesheet_link_tag "application.css" %>

De:

<script src="../../assets/javascripts/modernizr.js" type="text/javascript"></script>

A:

<%= javascript_include_tag "application.js" %>

De:

<img src="../../assets/images/mainImg.jpg" alt="img">

A:

<%= image_tag "mainImg.jpg"  %>

Esto ayuda un poco, ya que las imágenes se cargan, y se ve muy poco del estilo; sin embargo, está muy lejos de lo que se supone que debe ser. Estoy pensando que es porque mi amigo hace llamadas relativas dentro de los propios archivos css:

body {
    background-image: url(../images/bg.jpg);
    background-repeat: repeat;
}

He intentado reemplazarlos con url(<%= asset_path 'bg.jpg' %>) etc... pero no tiene efecto. He intentado tantas cosas y he leído tantas publicaciones. Me pregunto si hay alguna forma en que Rails me permita usar rutas relativas. He intentado:

config.assets.enabled = false

pero eso no ayuda... por favor... que estoy haciendo mal? No creo que mi amigo quiera dejar de usar rutas relativas para su trabajo, ya que es su forma de hacer las cosas. El sitio funciona bien fuera de Rails, pero necesito que funcione con Rails para mi aplicación web. Cualquier consejo sería muy apreciado. Gracias por tener la paciencia de leer todo esto.

PD: estoy usando Ruby 1.9.3 y Rails 3.2.6

preguntado el 29 de julio de 12 a las 07:07

3 Respuestas

Tratar de usar /assets/style.css no /assets/stylesheets/style.css y así sucesivamente.

Si existe tal estructura:

app
  assets
    stylesheets
    javascripts

Luego, para obtener acceso a los archivos en app/assets ó en app/assets/any_folder deberías usar la ruta /assets/file.

Actualizado

Aquí intenta:

body {
    background-image: url(bg.jpg);
    background-repeat: repeat;
}

o:

body {
    background-image: url(/assets/bg.jpg);
    background-repeat: repeat;
}

Respondido 29 Jul 12, 07:07

Esto realmente resolvió el 50% del problema xD ¡muchas gracias! Sin embargo, el estilo todavía está apagado. No estoy seguro si es porque los archivos css usan rutas relativas o? :( ¿Tendré que ir a los archivos css y cambiar las rutas a las imágenes a las que se refiere? como: body { background-image: url(../images/bg.jpg); background-repeat: repeat; } From url (../images/bg.jpg) a url(/assets/bg.jpg)? - orlinelmago

¡Oh, mi palabra... funcionó al 100%... Usé la corrección url(/assets/bg.jpg) para todas las referencias de imagen en los archivos css y funcionó! ¡Muchas muchas muchas gracias! - orlinelmago

Rails 3.1 introdujo el nuevo Asset Pipeline. Te recomiendo que leas esto: http://guides.rubyonrails.org/asset_pipeline.html

En su archivo app/views/layouts/application.html.erb, asegúrese de tener esto:

<%= stylesheet_link_tag "application", :media => "all" %>

En su archivo app/assets/stylesheets/application.css, asegúrese de tener esta línea:

*= require_tree .

(Esto asegurará que cualquier archivo css que tenga en el directorio app/assets/stylesheets estará disponible para su aplicación)

en su archivo css, puede hacer esto para hacer referencia a imágenes en su directorio app/assets/images:

background-image: url(bg.jpg);

Respondido 29 Jul 12, 07:07

¿Qué pasa con las fuentes en otro directorio? - Ian Warner

Para fuentes, creo que necesita agregar esta línea a config/application.rb: config.assets.paths << Rails.root.join("app", "assets", "fonts") - calasyr

En caso de que quieras usar recursos locales en tu configuración initializers y tienes esta estructura de carpetas:

app assets stylesheets javascripts

Todo lo que tiene que hacer es: (en este ejemplo, estoy usando la configuración/inicializador base de Spree)

Spree.config do |config| config.admin_interface_logo = '/assets/logo/custom_admin.png' config.logo = '/assets/logo/custom_store.jpg' end

Así que usa /assets/your_file_or_path y funcionará :D

Respondido el 20 de junio de 18 a las 03:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.