使用Carrierwave从URL保存图像

时间:2014-10-30 14:15:19

标签: javascript ruby-on-rails ruby backbone.js carrierwave

我对Rails非常基本,我正在尝试从URL保存图像,在谷歌搜索后我发现了我安装的Carrierwave宝石。但我不知道该怎么办。我也使用Backbone(我也非常基本)。

到目前为止,我已经创建了一个应用程序,用户可以在输入字段中键入moviename,然后显示结果列表。

我的电影搜索视图,

events:
  "keyup input": "doSearch"

doSearch: (e) ->
  @collection.setQuery $(e.currentTarget).val()
  @collection.fetch()
  $('.autocomplete-results').show()

doSearch函数被触发时,它将转到moviesearch集合,

class Movieseat.Collections.Moviesearch extends Backbone.Collection

  url: -> "http://api.themoviedb.org/3/search/movie?api_key=a8f7039633f2065942cd8a28d7cadad4&query=#{@query}"

  setQuery: (q) ->
    @query = q
    return

  parse: (response) ->
    return response.results

这会产生一个像这样的JSON文件,

http://api.themoviedb.org/3/search/movie?api_key=a8f7039633f2065942cd8a28d7cadad4&query=star%20war

我的searchresult视图然后在searchresult模板中呈现moviesearch视图

template: JST['movieseats/searchresult']

initialize: -> 
  @collection.on('add', @render, this)
  return

render: -> 
  $(@el).html(@template(movie: @collection))
  this

searchresult模板,

<% for movie in @movie.models : %>
    <li>
        <img src="http://image.tmdb.org/t/p/w500/<%= movie.get('poster_path')%>"></img>
        <span class="movie-title"><%= movie.get('title') %></span>
        <p class="releaste_date"><%= movie.get('release_date') %></p>
        <p class="addmovie">Add movie</p>
    </li> 
<% end %>

这都是Backbone。以下步骤是存储数据。 addEntry函数将变量movie_title保存到我的Rails模型中。

addEntry: (e) -> 
  movie_title = $(e.target).parent().find('.movie-title').text()
  @collection.create title: movie_title

此函数在此模板的.movie-title中查找文本

<% for movie in @movie.models : %>
    <li>
        <img src="http://image.tmdb.org/t/p/w500/<%= movie.get('poster_path')%>"></img>
        <span class="movie-title"><%= movie.get('title') %></span>
        <p class="releaste_date"><%= movie.get('release_date') %></p>
        <p class="addmovie">Add movie</p>
    </li> 
<% end %>

我有一个名为movies_controller的rails控制器。这具有以下创建定义

def create
  @movie = Movie.new(movie_params)
  @user = current_user
  user_id = @user[:id]
  @movie[:user_id] = user_id

  respond_to do |format|
    if @movie.save
      format.html { redirect_to @movie, notice: 'Movie was successfully created.' }
      format.json { render json: @movie, status: :created, location: @movie }
    else
      format.html { render action: "new" }
      format.json { render json: @movie.errors, status: :unprocessable_entity }
    end
  end
end

如你所见,我有一个<img src="http://image.tmdb.org/t/p/w500/<%= movie.get('poster_path')%>"></img>这是我想在Rails模型中保存的图像。

我如何从这里开始?我找到了以下post和此代码,

uploader = ImageUploader.new
uploader.download! some_remote_url
uploader.store!

但在那篇文章中没有发布文档,所以我不知道如何在我的项目中实现这个代码。另外我查看了Git页面上的文档,但我发现很难找到我需要做的事情。

2 个答案:

答案 0 :(得分:1)

假设这是您要托管的图片的路径

"http://image.tmdb.org/t/p/w500/<%= movie.get('poster_path')%>"

您应该可以执行类似

的操作
def create
  @movie = Movie.new(movie_params)
  @movie.remote_image_url = "http://image.tmdb.org/t/p/w500/#{@movie.get('poster_path')}"
  #rest of code
end

答案 1 :(得分:0)

从远程网址加载图片非常简单 看一下这个railscasts

MODEL.remote_image_url = 'http:...jpg'

<%= form_for @painting, :html => {:multipart => true} do |f| %>    
  <p>  
    <%= f.label :name %><br />  
    <%= f.text_field :name %>  
  </p>  
  <p>  
    <%= f.file_field :image %>  
  </p>  
  <p>  
    <%= f.label :remote_image_url, "or image URL" %>  
    <%= f.text_field :remote_image_url %>  
  </p>  
  <p><%= f.submit %></p>  
<% end %>