使用 ERB 访问图像而不是资产管道
Use ERB to access images NOT asset pipeline
我想显示一个动态选择的图像,因此在 html 中我调用了变量 @background_img
,其中包含特定图片的 url。但是,做
<body style='background-image: url(<%=@background_img%>);'>
只是拒绝显示背景图像。我是否误解了 ERB 的工作原理,因为 Rails 不会简单地预编译 CSS 并最终得到一个有效的 HTML 图像获取?在预览我的应用程序时使用 Chrome 开发人员工具显示 url()
,显然空参数无法获取图像。
编辑:
只是想补充一点,我宁愿不必下载图像,而是保留我已经准备好的 urls。
这是天气预报员class:
require 'rest-client'
class WeatherMan
#images within accessible data structures, designed to be expandable
def initialize
@hot = ['https://farm2.staticflickr.com/1515/23959664094_9c59962bb0_b.jpg']
@rain = ['https://farm8.staticflickr.com/7062/6845995798_37c20b1b55_h.jpg']
end
def getWeather(cityID)
response = JSON.parse RestClient.get "http://api.openweathermap.org/data/2.5/weather?id=#{cityID}&APPID=bd43836512d5650838d83c93c4412774&units=Imperial"
return {
temp: response['main']['temp'].to_f.round,
cloudiness: response['clouds']['all'].to_f.round,
humidity: response['main']['humidity'].to_f.round,
windiness: response['wind']['speed'],
condition_id: response['weather'][0]['id'].to_f,
condition_name: response['weather'][0]['main'],
condition_description: response['weather'][0]['description'],
condition_img: response['weather'][0]['icon']
}
end
def getImg(temp)
if temp <= 100 #CHANGE!!!
return @rain[rand(@rain.length)]
elsif temp <= 32
return nil
elsif temp <= 50
return nil
elsif temp <= 75
return nil
elsif temp <= 105
return nil
end
end
end
很抱歉现在在移动设备上出现格式问题。
现在,控制器class:
load File.expand_path("../../data_reader.rb", __FILE__)
load File.expand_path("../../weatherstation.rb", __FILE__)
class PagesController < ApplicationController
def home
# `sudo python /home/pi/Documents/coding/raspberryPI/weatherStation/app/led_blink.py`
server = WeatherMan.new
@outside_data = server.getWeather(4219934)
@sensor_temp = DRead.read_data(File.expand_path('../../data.txt', __FILE__), 'temperature')
@sensor_temp = (@sensor_temp.to_f * (9.0/5) + 32).round(2)
@background_img = server.getImg(@outside_data[:temp])
end
end
问题似乎是 @background_img
没有填充。
这 的原因似乎 是您的 Weatherman
class。我会尝试纠正这个问题...
控制器
如果您在 body 标签上调用 @background_img
,这意味着它可以在 每个 控制器操作中访问。因此,与其在单独的 home
操作中声明它,不如在每次加载视图时都使其可用:
#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
before_action :set_background
private
def set_background
server = WeatherMan.new
@outside_data = server.getWeather(4219934)
@sensor_temp = DRead.read_data(File.expand_path('../../data.txt', __FILE__), 'temperature')
@sensor_temp = (@sensor_temp.to_f * (9.0/5) + 32).round(2)
@background_img = server.getImg(@outside_data[:temp])
end
end
--
Class
我看到的主要问题是您的 class 没有给您一个值。我会尝试重构您的 class,尽管我不能保证任何事情:
require 'rest-client'
class WeatherMan
@@static = {
hot: 'https://farm2.staticflickr.com/1515/23959664094_9c59962bb0_b.jpg',
rain: 'https://farm8.staticflickr.com/7062/6845995798_37c20b1b55_h.jpg'
}
def getWeather(cityID)
response = JSON.parse RestClient.get weather_url(cityID)
return {
temp: response['main']['temp'].to_f.round,
cloudiness: response['clouds']['all'].to_f.round,
humidity: response['main']['humidity'].to_f.round,
windiness: response['wind']['speed'],
condition_id: response['weather'][0]['id'].to_f,
condition_name: response['weather'][0]['main'],
condition_description: response['weather'][0]['description'],
condition_img: response['weather'][0]['icon']
}
end
def getImg(temp)
#### This should return the image ####
#### Below is a test ####
@@static[:hot]
end
private
def weather_url city
"http://api.openweathermap.org/data/2.5/weather?id=#{city}&APPID=bd43836512d5650838d83c93c4412774&units=Imperial"
end
end
--
查看
您需要确保您从控制器获取返回的数据,以便将其填充到您的视图中。
因为您的 getImg
方法正在返回 nil
,您将收到 nil
响应。我已经 暂时 使用您在 class.
中包含的 flickr
链接之一进行了修改
如果您总是有返回的图像,则以下方法应该有效:
#app/views/layouts/application.html.erb
<body style='background-image: url(<%= @background_img %>);'>
因为您的 @background_img
是外部 URL,所以上面的方法应该有效。如果您使用的是 asset_pipeline
中的文件,则需要使用 image_url
etc
我想显示一个动态选择的图像,因此在 html 中我调用了变量 @background_img
,其中包含特定图片的 url。但是,做
<body style='background-image: url(<%=@background_img%>);'>
只是拒绝显示背景图像。我是否误解了 ERB 的工作原理,因为 Rails 不会简单地预编译 CSS 并最终得到一个有效的 HTML 图像获取?在预览我的应用程序时使用 Chrome 开发人员工具显示 url()
,显然空参数无法获取图像。
编辑: 只是想补充一点,我宁愿不必下载图像,而是保留我已经准备好的 urls。
这是天气预报员class:
require 'rest-client'
class WeatherMan
#images within accessible data structures, designed to be expandable
def initialize
@hot = ['https://farm2.staticflickr.com/1515/23959664094_9c59962bb0_b.jpg']
@rain = ['https://farm8.staticflickr.com/7062/6845995798_37c20b1b55_h.jpg']
end
def getWeather(cityID)
response = JSON.parse RestClient.get "http://api.openweathermap.org/data/2.5/weather?id=#{cityID}&APPID=bd43836512d5650838d83c93c4412774&units=Imperial"
return {
temp: response['main']['temp'].to_f.round,
cloudiness: response['clouds']['all'].to_f.round,
humidity: response['main']['humidity'].to_f.round,
windiness: response['wind']['speed'],
condition_id: response['weather'][0]['id'].to_f,
condition_name: response['weather'][0]['main'],
condition_description: response['weather'][0]['description'],
condition_img: response['weather'][0]['icon']
}
end
def getImg(temp)
if temp <= 100 #CHANGE!!!
return @rain[rand(@rain.length)]
elsif temp <= 32
return nil
elsif temp <= 50
return nil
elsif temp <= 75
return nil
elsif temp <= 105
return nil
end
end
end
很抱歉现在在移动设备上出现格式问题。
现在,控制器class:
load File.expand_path("../../data_reader.rb", __FILE__)
load File.expand_path("../../weatherstation.rb", __FILE__)
class PagesController < ApplicationController
def home
# `sudo python /home/pi/Documents/coding/raspberryPI/weatherStation/app/led_blink.py`
server = WeatherMan.new
@outside_data = server.getWeather(4219934)
@sensor_temp = DRead.read_data(File.expand_path('../../data.txt', __FILE__), 'temperature')
@sensor_temp = (@sensor_temp.to_f * (9.0/5) + 32).round(2)
@background_img = server.getImg(@outside_data[:temp])
end
end
问题似乎是 @background_img
没有填充。
这 的原因似乎 是您的 Weatherman
class。我会尝试纠正这个问题...
控制器
如果您在 body 标签上调用 @background_img
,这意味着它可以在 每个 控制器操作中访问。因此,与其在单独的 home
操作中声明它,不如在每次加载视图时都使其可用:
#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
before_action :set_background
private
def set_background
server = WeatherMan.new
@outside_data = server.getWeather(4219934)
@sensor_temp = DRead.read_data(File.expand_path('../../data.txt', __FILE__), 'temperature')
@sensor_temp = (@sensor_temp.to_f * (9.0/5) + 32).round(2)
@background_img = server.getImg(@outside_data[:temp])
end
end
--
Class
我看到的主要问题是您的 class 没有给您一个值。我会尝试重构您的 class,尽管我不能保证任何事情:
require 'rest-client'
class WeatherMan
@@static = {
hot: 'https://farm2.staticflickr.com/1515/23959664094_9c59962bb0_b.jpg',
rain: 'https://farm8.staticflickr.com/7062/6845995798_37c20b1b55_h.jpg'
}
def getWeather(cityID)
response = JSON.parse RestClient.get weather_url(cityID)
return {
temp: response['main']['temp'].to_f.round,
cloudiness: response['clouds']['all'].to_f.round,
humidity: response['main']['humidity'].to_f.round,
windiness: response['wind']['speed'],
condition_id: response['weather'][0]['id'].to_f,
condition_name: response['weather'][0]['main'],
condition_description: response['weather'][0]['description'],
condition_img: response['weather'][0]['icon']
}
end
def getImg(temp)
#### This should return the image ####
#### Below is a test ####
@@static[:hot]
end
private
def weather_url city
"http://api.openweathermap.org/data/2.5/weather?id=#{city}&APPID=bd43836512d5650838d83c93c4412774&units=Imperial"
end
end
--
查看
您需要确保您从控制器获取返回的数据,以便将其填充到您的视图中。
因为您的 getImg
方法正在返回 nil
,您将收到 nil
响应。我已经 暂时 使用您在 class.
flickr
链接之一进行了修改
如果您总是有返回的图像,则以下方法应该有效:
#app/views/layouts/application.html.erb
<body style='background-image: url(<%= @background_img %>);'>
因为您的 @background_img
是外部 URL,所以上面的方法应该有效。如果您使用的是 asset_pipeline
中的文件,则需要使用 image_url
etc