我有一个用户脚手架(DEVISE),一个评论脚手架和一个电影脚手架
目前,评论已发布在电影显示页面上。
我遇到的麻烦就是让用户创建评论。因此评论是由用户创建的。
因此,如果我在movies/:show
我能做到
身体:<%= comment.body %>
作者:<%= comment.user.first_name %>
我如何发表评论属于用户,并且只有该用户可编辑且可销毁?
请不要告诉使用before_filter :authenticate_user!, only: [:create,:destroy]
或者遵循带有Microposts的Michael Hartl教程,因为我已经完成了这两个并且它们不起作用
无论如何,有谁知道我怎么做到这一点?
MAny谢谢
答案 0 :(得分:2)
首先,我只会向所有者显示edit
和destroy
链接:
<% if comment.user == current_user %>
<%= link_to "edit", ... %>
<%= link_to "delete", ... %>
<% end %>
然后,如果知道如何在chrome中使用inspect元素的聪明人,我会对评论所有者进行控制器级别检查:
def edit
@comment = Comment.find(params[:id])
if @comment.user == current_user
@comment.update_attributes(....)
@message = "Comment updated or created or deleted, depends on method"
else
@message = "It's not your comment wise guy :)"
end
redirect_to :back, notice: @message
end
与销毁和更新方法相同。
!不是复制/粘贴就绪代码。
这就是我曾经做过的事情而且效果很好,其他方法你可以使用gem cancan
https://github.com/ryanb/cancan并为用户设置能力。
can :edit, Comment, :user_id => user.id
can :destroy, Comment, :user_id => user.id
以这种方式设置能力只有所有者才能访问编辑页面和更新,销毁操作。
答案 1 :(得分:1)
关于设计助手'current_user'的内容是什么?像这样的东西:
class Comment < ActiveRecord::Base
belongs_to :user
end
class CommentsController < ApplicationController
def edit
comment = current_user.comments.where(id: params[:id]).first
if comment.nil?
...
401 error or something else (current user is not creator of this comment)
else
...
end
end
end
您还可以查看视图中的权限:
<% if comment.user == current_user %>
<%= link_to "edit comment" ... %>
<%= link_to "delete comment" ... %>
<% end %>
答案 2 :(得分:0)
要使评论属于用户,请执行create
操作:
comment = current_user.comments.new(params[:comment])
使其仅对所有者
可编辑/可销毁before_filter :find_comment, only: [:show, :edit, :update, :destroy]
before_filter :authorize_user!, only: [:edit, :update, :destroy]
#...
private
def find_comment
@comment = Comment.find params[:id]
end
def authorize_user!
deny_access if @comment.user != current_user # example
end
答案 3 :(得分:0)
确保用户使用:authenticate_user!
登录是一件好事,但您必须将评论与该用户相关联。
Devise
为您提供current_user
。因此,如果您的Comment
belongs_to :user
和User
has_many :comments
写在CommentsController
中:
def new
@comment= current_user.comments.new
end
def create
@comment= current_user.comments.new(params[:comment])
if @comment.save
...
end
end
def edit
@comment= current_user.comments.find(params[:id])
end
def update
@comment= current_user.comments.find(params[:id])
if @comment.update_attributes(params[:comment])
...
end
end