我认为未定义的方法“图像”
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.
关于您朋友所说的话,如果您进入 schema.rb
文件,您将能够看到哪个 table 添加了回形针列。通过为 users
table 生成迁移,您可能导致了冲突。
我认为问题可能出在您如何将 "user" 更改为 "posts."。只需更改控制器或视图名称就可以了,但是更改模型是您必须生成的不同内容更改 table 名称
的迁移
我正在使用 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 thanrake 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.
关于您朋友所说的话,如果您进入 schema.rb
文件,您将能够看到哪个 table 添加了回形针列。通过为 users
table 生成迁移,您可能导致了冲突。
我认为问题可能出在您如何将 "user" 更改为 "posts."。只需更改控制器或视图名称就可以了,但是更改模型是您必须生成的不同内容更改 table 名称
的迁移