用户可以在 Rails 论坛的评论中添加图片
Ability for users to add images to comments in Rails forum
所以我在我的 rails 论坛中添加了用户向 post 添加图像的功能。我现在希望用户能够将图像添加到 posts 的评论中。
我从迁移开始 add_attachment_image_to_comments.rb
class AddAttachmentImageToComments < ActiveRecord::Migration
def self.up
change_table :comments do |t|
t.attachment :image
end
end
def self.down
remove_attachment :comments, :image
end
end
编辑了视图文件:
= simple_form_for([@post, @post.comments.build]) do |f|
= f.input :comment
= f.input :image
%br
= f.submit
这是 posts_controller 文件:
class PostsController < ApplicationController
before_action :find_post, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!, except: [:index, :show]
def index
@posts = Post.all.order("created_at DESC").paginate(page: params[:page], per_page: 7)
end
def show
end
def new
@post = current_user.posts.build
end
def create
@post = current_user.posts.build(post_params)
if @post.save
redirect_to @post
else
render 'new'
end
end
def edit
end
def update
if @post.update(post_params)
redirect_to @post
else
render 'edit'
end
end
def destroy
@post.destroy
redirect_to root_path
end
private
def find_post
@post = Post.find(params[:id])
end
def post_params
params.require(:post).permit(:title, :content, :image)
end
结束
这是 comments_controller 文件:
class CommentsController < ApplicationController
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.create(params[:comment].permit(:comment, :image))
@comment.user_id = current_user.id if current_user
@comment.save
if @comment.save
redirect_to post_path(@post)
else
render 'new'
end
end
def edit
@post = Post.find(params[:post_id])
@comment = @post.comments.find(params[:id])
end
def update
@post = Post.find(params[:post_id])
@comment = @post.comments.find(params[:id])
if @comment.update(params[:comment].permit(:comment, :image))
redirect_to post_path(@post)
else
render 'edit'
end
end
def destroy
@post = Post.find(params[:post_id])
@comment = @post.comments.find(params[:id])
@comment.destroy
redirect_to post_path(@post)
end
end
这使用户能够添加附件。我现在遇到的问题是让图像显示在 post 的评论部分。
这是我的节目文件:
#post_content
%h1= @post.title
%p= @post.content
= image_tag @post.image.url(:medium)
#comments
%h2
= @post.comments.count
Comment(s)
= render @post.comments
= image_tag @comment.image.url(:medium)
我收到错误消息 - nil:NilClass 的未定义方法“图像”。突出显示这一行 - = image_tag @comment.image.url(:medium)
非常感谢任何帮助。
undefined method `image' for nil:NilClass
问题是 @comment
在这一行 = image_tag @comment.image.url(:medium)
是 nil 因为你还没有声明 @comment
在 posts_controller
的 show
方法中。
解决方案
因为post可以有很多评论 并且由于 @post
可用,您可以在如下视图中遍历 @post
的评论。
- @post.comments.each do |comment|
= image_tag comment.image.url(:medium)
所以我在我的 rails 论坛中添加了用户向 post 添加图像的功能。我现在希望用户能够将图像添加到 posts 的评论中。 我从迁移开始 add_attachment_image_to_comments.rb
class AddAttachmentImageToComments < ActiveRecord::Migration
def self.up
change_table :comments do |t|
t.attachment :image
end
end
def self.down
remove_attachment :comments, :image
end
end
编辑了视图文件:
= simple_form_for([@post, @post.comments.build]) do |f|
= f.input :comment
= f.input :image
%br
= f.submit
这是 posts_controller 文件:
class PostsController < ApplicationController
before_action :find_post, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!, except: [:index, :show]
def index
@posts = Post.all.order("created_at DESC").paginate(page: params[:page], per_page: 7)
end
def show
end
def new
@post = current_user.posts.build
end
def create
@post = current_user.posts.build(post_params)
if @post.save
redirect_to @post
else
render 'new'
end
end
def edit
end
def update
if @post.update(post_params)
redirect_to @post
else
render 'edit'
end
end
def destroy
@post.destroy
redirect_to root_path
end
private
def find_post
@post = Post.find(params[:id])
end
def post_params
params.require(:post).permit(:title, :content, :image)
end
结束
这是 comments_controller 文件:
class CommentsController < ApplicationController
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.create(params[:comment].permit(:comment, :image))
@comment.user_id = current_user.id if current_user
@comment.save
if @comment.save
redirect_to post_path(@post)
else
render 'new'
end
end
def edit
@post = Post.find(params[:post_id])
@comment = @post.comments.find(params[:id])
end
def update
@post = Post.find(params[:post_id])
@comment = @post.comments.find(params[:id])
if @comment.update(params[:comment].permit(:comment, :image))
redirect_to post_path(@post)
else
render 'edit'
end
end
def destroy
@post = Post.find(params[:post_id])
@comment = @post.comments.find(params[:id])
@comment.destroy
redirect_to post_path(@post)
end
end
这使用户能够添加附件。我现在遇到的问题是让图像显示在 post 的评论部分。 这是我的节目文件:
#post_content
%h1= @post.title
%p= @post.content
= image_tag @post.image.url(:medium)
#comments
%h2
= @post.comments.count
Comment(s)
= render @post.comments
= image_tag @comment.image.url(:medium)
我收到错误消息 - nil:NilClass 的未定义方法“图像”。突出显示这一行 - = image_tag @comment.image.url(:medium)
非常感谢任何帮助。
undefined method `image' for nil:NilClass
问题是 @comment
在这一行 = image_tag @comment.image.url(:medium)
是 nil 因为你还没有声明 @comment
在 posts_controller
的 show
方法中。
解决方案
因为post可以有很多评论 并且由于 @post
可用,您可以在如下视图中遍历 @post
的评论。
- @post.comments.each do |comment|
= image_tag comment.image.url(:medium)