图像未显示在Rails中的数据库中

时间:2014-05-10 03:15:45

标签: ruby-on-rails ruby ruby-on-rails-4

我正在使用Rails 4.1,我创建了一个User类。创建用户时,可以导入头像。但最多我得到一个“图像”显示,但它没有加载数据库中的实际图像。

然后我尝试使用this帖子来修复它,但现在我只是得到了“No Route Matches”。这是我的确切错误:

No route matches {:action=>"show_image", :controller=>"users_controller", :id=>"1"}

它声称它来自我的index.html.erb中的这一行:

<%= image_tag url_for(:controller => "users_controller", :action => "show_image", :id => user.id) %>

这是我的控制器:

 def show_image
    @user = User.find(params[:id])
    send_data @user.avatar, :type => 'image/png', :disposition => 'inline'
 end

我的用户是index.html.erb:

<html>

  <head>
  </head>

   <body>
    <h1>Users</h1>
    <table>
      <tr>
        <th colspan="1"></th>
      </tr>

      <% @users.each do |user| %>
        <tr>
          <%= image_tag url_for(:controller => "users_controller", :action => "show_image", :id => user.id) %>
          <td><%= user.username %></td>
        </tr>
      <% end %>
    </table>
  </body>

</html>

任何想法或建议都将受到高度赞赏。提前谢谢。

编辑:这就是我的路线:

Rails.application.routes.draw do
  get 'sessions/login'
  get 'sessions/login_attempt'
  get 'sessions/home'
  get 'sessions/profile'
  get 'sessions/setting'
  get 'welcome/index'
  get 'users/new'

  post 'sessions/login_attempt'
  post 'sessions/logout'

  resources :users

  root 'welcome#index'
end

编辑:我也尝试将以下内容添加到Routes文件中,如@Question和@ j0k在我之前关注的主题中所建议的那样:

resources :users do
  get 'show_image', :on => :collection
end

get 'users/show_image' => 'users#show_image'

我也试过这个

get 'users/show_image'

但是我仍然遇到同样的错误。

我得到的图像缺失图标: enter image description here

我的Users类中的两行,我添加了头像:

has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" }, :default_url => "/images/:style/missing.png"
validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/

在查找数据库中的图像时,这是我发现的...我运行了以下命令:

sqlite> select avatar_file_name, avatar_content_type, avatar_file_size from users;

得到了:

|image/png|660726
|image/gif|3614
|image/png|282

...所以没有文件名。

当我在路径中查找文件时,我发现在此: / public / system / users / avatars / 000/000/001 / original my image'up.png'已存在。它也存在于../medium和../thumb中。

编辑:从@RichPeck建议更新。

所以我是&lt;%= image_tag @ user.avatar.url%&gt; ......而这正是我在做的......

  <% @users.each do |user| %>
    <tr>
      <%= image_tag user.avatar.url %>
    </tr>
  <% end %>

我对如何&lt;%= image_tag @ user.avatar.url%&gt;感到困惑。会获得特定用户的头像。 @user是否引用所有用户?不过,无论如何,我试过了@RichPeck的建议。我添加了两个&lt;%= image_tag @ user.avatar.url%&gt;和&lt;%= debug @ user.avatar%&gt;。但两人都给了我以下错误:

undefined method `avatar' for nil:NilClass

编辑:我刚刚浏览了Paperclip教程,并将其与我所拥有的相比较。我发现了一些差异,但我不认为它会产生很大的不同。但是,我会在这里发布,所以如果有人知道出了什么问题他们可以提供帮助。

修改或新视图

回形针

<%= form_for @user, :url => users_path, :html => { :multipart => true } do |form| %>
 <%= form.file_field :avatar %>
<% end %>

我的代码(我最关心的是:url =&gt;但我觉得应该没问题)

<%= form_for(:user, :url => {:controller => 'users', :action => 'create'}, :html => { :multipart => true }) do |f| %>
  <p> Username:</br> <%= f.text_field :username%> </p>
  <p> Email:</br> <%= f.text_field :email%> </p>
  <p> Password:</br> <%= f.password_field :password%></p>
  <p> Password Confirmation:</br> <%= f.password_field :password_confirmation%> </p>
  <%= f.file_field :avatar %>
  <%= f.submit :Signup %>
<% end %>

控制器

回形针

def create
  @user = User.create( user_params )
end

private

def user_params
  params.require(:user).permit(:avatar)
end

我的代码

def create
  @user = User.new(user_params)
  if @user.save
    flash[:notice] = "You signed up successfully"
    flash[:color]= "valid"
  else
    flash[:notice] = "Form is invalid"
    flash[:color]= "invalid"
  end
  render "new"
end

private

def user_params
  params.require(:user).permit(:username, :email, :password, :avatar)
end

编辑:看了一下之后,我意识到我试图访问用户页面没有我的会话。我在做localhost:3000 /用户不是localhost:3000 / users?id = 1。所以我的身份证从未被传递过。

我必须将以下内容添加到我的用户控制器:

def index
  @users = User.all
  @user = User.find(params[:id])  # <--- Added this line
end

然而,&lt;%= image_tag @ user.avatar.url%&gt;仍显示默认的空白图像。但是我能够得到&lt;%= debug @ user.avatar%&gt;上班。这是debug命令的输出。

--- &70308396554900 !ruby/object:Paperclip::Attachment
name: :avatar
instance: !ruby/object:User
  attributes:
    id: 1
    username: jones1
    email: stupid1@stupid.com
    encrypted_password: $2a$10$dvvLzRCQQVngFpt5TfPqJOtU8s02GUj6UOHlzibWi1CaQFY1BA8tS
    salt: $2a$10$dvvLzRCQQVngFpt5TfPqJO
    created_at: 2014-05-10 05:19:07.138281000 Z
    updated_at: 2014-05-10 05:19:07.138281000 Z
    avatar_file_name: 
    avatar_content_type: image/png
    avatar_file_size: 397
    avatar_updated_at: 2014-05-10 05:19:06.715067000 Z
options: &70308396554880
  :convert_options: {}
  :default_style: :original
  :default_url: /images/:style/missing.png
  :escape_url: true
  :restricted_characters: !ruby/regexp /[&$+,\/:;=?@<>\[\]\{\}\|\\\^~%# ]/
  :filename_cleaner: 
  :hash_data: ':class/:attachment/:id/:style/:updated_at'
  :hash_digest: SHA1
  :interpolator: &70308352640280 !ruby/module 'Paperclip::Interpolations'
  :only_process: []
  :path: ':rails_root/public:url'
  :preserve_files: false
  :processors:
  - :thumbnail
  :source_file_options: &70308351975980 {}
  :storage: :filesystem
  :styles:
    :medium: 300x300>
    :thumb: 100x100>
  :url: /system/:class/:attachment/:id_partition/:style/:filename
  :url_generator: !ruby/class 'Paperclip::UrlGenerator'
  :use_default_time_zone: true
  :use_timestamp: true
  :whiny: true
  :check_validity_before_processing: true
post_processing: true
queued_for_delete: []
queued_for_write: {}
errors: {}
dirty: false
interpolator: *70308352640280
url_generator: !ruby/object:Paperclip::UrlGenerator
  attachment: *70308396554900
  attachment_options: *70308396554880
source_file_options: *70308351975980
whiny: true

编辑:我必须晚上睡觉前的最后一次编辑。我也做了&lt;%= debug @ user.avatar.url%&gt;并返回以下内容:--- / images / original /missing.png?1399954308

2 个答案:

答案 0 :(得分:0)

由于您正在使用paperclip,并且为了保持以后查看此内容的所有人的清晰度:

<强>回形针

  

当您使用Paperclip时,它会创建一个对象&amp;附加到你的   原始的ActiveRecord对象。定义has_attached_file :____时,该元素的名称就是Paperclip对象的名称   被叫,这意味着你可以打电话给@user .____来访问它

您遇到的问题是您正在使用其他流程来加载图片。这是完全没必要的,正如评论中指出的那样,Paperclip会自动将.url method分配给附加的Paperclip对象

应该能够调用<%= image_tag @user.avatar.url %>来输出relvant图像。我知道你知道这一点,但我想帮助那些可能会在未来看到这个主题的人


错误

就您的错误而言,看过您的评论&amp;更新,它似乎是你如何调用图像的问题,或者它可能是如何存储在数据库中

你能为我们这样做吗?

<%= debug @user.avatar #-> this will show the entire avatar object %>

我相信您的数据库将没有正确的列,因此Paperclip会提取错误的文件名或其他内容。某处会有一个非常微不足道的错误

答案 1 :(得分:-1)

一般来说,设置似乎相当复杂 - 考虑到您想要显示用户图像。对于像用户图像这样的东西,我正在为我的项目使用回形针:https://github.com/thoughtbot/paperclip ..你可能想看看它。它自动化图像上传,调整大小等。我在几个项目中使用它,从不遇到任何问题。

如果这不是你需要的,也许你让我知道你到底想要做什么。