我认为未定义的方法“图像”

undefined method `image' in my view

我正在使用 Paperclip,唯一的问题是在我的图像标签中,我有一个未定义的方法 "image"。

<%= image_tag @posts.image.url(:medium) %>

是我的错误发生的地方。当我加载一个新的迁移时,我不小心做了 "rails g paperclip user image" 而不是 "rails g paperclip posts image" 所以我进入我的代码并将 "user" 更改为 "posts." 我问了类似的东西并且有人提到它与我的 schema.rb 文件 (?).

为了安全起见,这是我的 post 控制器:

 class PostsController < ApplicationController
    def index
        @posts = Post.all.order('created_at DESC')
    end

    def new
        @post = Post.new

        if @post.save
            redirect_to @post
        else
            render 'new'
        end
    end

    def create
        @post = Post.new(post_params)
        @post.save

        redirect_to @post
    end

    def show
        @post = Post.find(params[:id])
    end

    def edit
        @post = Post.find(params[:id])
    end

    def update
        @post = Post.find(params[:id])

        if @post.update(params[:post].permit(:title, :body))
            redirect_to @post
        else
            render 'edit'
        end
    end

    def destroy
        @post = Post.find(params[:id])
        @post.destroy

        redirect_to root_path
    end


    private
    def post_params
        params.require(:post).permit(:title, :body, :image)
    end
end

但这是我的迁移文件:

class AddAttachmentImageToUsers < ActiveRecord::Migration
  def self.up
    change_table :posts do |t|
      t.attachment :image
    end
  end

  def self.down
    remove_attachment :posts, :image
  end
end

和我的 user.rb 文件:

has_attached_file :image, :styles => { large: '600x600>', medium: '300x300>', thumb: '150x150#' }
  validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/

您需要一次访问一个 post 的图像,因此您需要遍历 post 集合并为每个 post 获取图像,如下所示

<% @posts.each do |post| %>
  <%= image_tag post.image.url(:medium) %>
<% end %>

从评论和您的代码来看,您的 @posts 变量似乎为空或未定义。要添加到原始答案,这是我要做的:

#app/controllers/posts_controller.rb
class PostsController < ActionController::Base
   def index
      @posts = Post.all.order(created_at: :desc)
   end
end

#app/views/posts/index.html.erb
<% if @posts.any? %>
   <% @posts.each do |post| %>
       <%= image_tag post.image.url(:medium) %>
   <% end %>
<% end %>

必须 view 中引用了 @posts 变量,它对应于 action 您是 运行 .从您的评论来看,情况似乎并非如此。

您需要引用 Post 模型的单个实例,以便 image 方法可用。

如果它不可用,则意味着您没有正确声明 @posts 变量,或者您的 Paperclip gem 设置不正确。


this is my user.rb file

哈哈好吧。这就是问题所在。

确保将其放入 post.rb 文件中:

#app/models/post.rb
class Post < ActiveRecord::Base
    has_attached_file :image, :styles => { large: '600x600>', medium: '300x300>', thumb: '150x150#' }
    validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/
end

Paperclip 基本上将存储的图像链接到数据库记录。因此,为了将 image 方法附加到您的模型,您必须将 Paperclip 选项附加到它。

将回形针调用放入 user.rb 会将 image 方法添加到您的 User 模型中。您需要将这些行放在 Post 模型中。

顺便说一句,我遇到了制作回形针的人:


that it was with my schema.rb file(?).

schema.rb 文件位于 /config/db/schema.rb

本质上,每次您迁移到您的数据库时,schema都会更新,因此如果您需要重新填充数据库,Rails 将能够拉出一组预构建的 SQL 调用来完成它。

Indeed, it is recommended that you use rake db:schema:load to rebuild a database (rather than rake db:migrate). HOWEVER (VERY IMPORTANT), IT DELETES ANY DATA in that database, making it unadvisable to use it for anything other than building new db's.

你可以read about Schema.rb here.

关于您朋友所说的话,如果您进入 schema.rb 文件,您将能够看到哪个 table 添加了回形针列。通过为 users table 生成迁移,您可能导致了冲突。

我认为问题可能出在您如何将 "user" 更改为 "posts."。只需更改控制器或视图名称就可以了,但是更改模型是您必须生成的不同内容更改 table 名称

的迁移