【问题标题】:undefined method `image' in my view在我看来未定义的方法“图像”
【发布时间】:2015-09-19 18:06:39
【问题描述】:

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

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

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

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

 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.image
  • 这就是问题所在
  • @posts 我认为是post 对象的集合。您需要为每个post 获取image。所以你需要遍历@posts,并且对于每个post,你可以使用这个&lt;%= image_tag post.image.url(:medium) %&gt;,我猜这会起作用。
  • 所以你建议摆脱 @ ?我认为这行不通
  • 不,我不是说要摆脱@,我建议请遍历@posts 的列表并尝试为每个帖子获取image

标签: ruby-on-rails ruby-on-rails-3 imagemagick paperclip erb


【解决方案1】:

从 cmets 和您的代码来看,您的 @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。从您的 cmets 来看,情况似乎并非如此。

您需要引用Post 模型的单个实例,才能使image 方法可用。

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


这是我的 user.rb 文件

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

确保将其放入您的 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 模型中。

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


它与我的 schema.rb 文件有关(?)。

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

基本上,每次您迁移到您的数据库时,schema 都会更新,因此在您需要重新填充数据库的情况下,Rails 将能够提取一个预先构建的集合执行此操作的 SQL 调用。

确实,建议你使用rake db:schema:load 重建数据库(而不是rake db:migrate)。然而(非常 重要),它会删除该数据库中的任何数据,使其 不建议将其用于构建新数据库之外的任何其他用途。

你可以read about Schema.rb here

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

【讨论】:

  • 感谢您的帮助,但我在进入讨论后得到了答案。将代码移动到我的Posts.rb 文件中是对的
【解决方案2】:

您需要一次访问一个帖子的图像,因此您需要像这样遍历帖子集合并获取每个帖子的图像

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

【讨论】:

  • 我只会得到一个未定义的方法错误,即使我在不​​同的文件中使用了&lt;% @posts.each do |post| %&gt;
  • 你怎么得到@posts你能分享那个代码
  • rails console 中试试这个,看看它应该崩溃@posts = Post.all.order('created_at DESC') 你在Post.all 上调用order 它应该崩溃bcoz .all 返回array,你正在尝试我认为应该崩溃的订单数组。其次在posts_controllerindex 操作中执行此操作@posts = Post.order('created_at DESC'),然后尝试使用我的代码来显示图像它应该可以工作
  • 不工作,仍然有完全相同的错误undefined method '.each'
【解决方案3】:

我认为问题可能在于您如何将“用户”更改为“帖子”。只需更改控制器或视图名称就可以了,但更改模型是另一回事,您必须生成迁移以更改表名字

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2020-08-19
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多