1

我有一个用户脚手架 (DEVISE)、一个评论脚手架和一个电影脚手架

目前,评论发布在电影放映页面上。

我遇到的问题是让用户创建评论。这样评论是由用户创建的。

所以如果我在movies/:show

我可以

正文:<%= comment.body %> 作者:<%= comment.user.first_name %>

我将如何发表属于用户的评论,并且只能由该用户编辑和销毁?

请不要告诉使用before_filter :authenticate_user!, only: [:create,:destroy] 或遵循 Michael Hartl Tutorial with Microposts,因为我已经完成了这两个并且它们不起作用

无论如何,有人知道我该怎么做吗?

非常感谢

4

4 回答 4

3

首先,我将仅向所有者显示editand链接:destroy

<% if comment.user == current_user %>
  <%= link_to "edit", ... %>
  <%= link_to "delete", ... %>
<% end %>

然后以防万一知道如何在 chrome 中使用检查元素的聪明人,我将为评论所有者进行控制器级别检查:

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

通过这种方式设置能力,只有所有者才能访问编辑页面和更新、销毁操作。

于 2013-06-12T17:36:01.297 回答
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 %>
于 2013-06-12T17:44:30.280 回答
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
于 2013-06-12T17:42:01.113 回答
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
于 2013-06-12T17:44:23.323 回答