用于显示和隐藏按钮的多重条件

时间:2016-01-25 20:47:43

标签: ruby-on-rails conditional

我试图制作一个“更新和删除按钮,只有在用户创建帖子或用户或主持人和/或主持人时才会显示。

我目前的帖子是

  def user_is_authorized_for_post?(post)
    current_user && (current_user == post.user || current_user.admin?) 
  end

我的按钮是:

<% if user_is_authorized_for_post?(@post) %>
<%= link_to "Edit", edit_topic_post_path(@post.topic, @post), class: 'btn btn-success' %>
<%= link_to "Delete Post", [@post.topic, @post], method: :delete, class: 'btn btn-danger', data: { confirm: 'Are you sure you want to delete this post?' } %>
<% end %>

更新:我将PostsHelper更新为:

  def user_is_authorized_for_post?(post)
    current_user && (current_user == post.user || current_user.admin?)  || (current_user == post.user || current_user.moderator?)
  end

它有效,但我的问题是,是否有更好的编码方式,因为我觉得它很长。

2 个答案:

答案 0 :(得分:1)

是的,写一个更简短的方法。

您可以使用guard子句来缩短方法定义:

def user_is_authorized_for_post?(post)
  return false unless current_user # the aforementioned guard clause
  current_user == post.user || current_user.admin? || current_user.moderator?
end

答案 1 :(得分:1)

您的代码没问题,但更好的方法是使用授权系统实现它,pundit是一个不错的选择,因为用户可以通过 Curl 或<来手动更新帖子强>邮差

您将拥有管理不同授权逻辑的策略类:

政策

class PostPolicy < ApplicationPolicy
  def edit?
    update?
  end

  #user is equivalent to the current_user and record == post
  def update?
    user && (user == record.user || user.admin?)  || (user == record.user || user.moderator?)

  end
end

在视图中授权

<% if policy(@post).edit? %>
  # the button
<% end %>

在控制器中授权

def edit
  @post = Post.find params[:id]
  authorized @post
end

def update
  @post = Post.find params[:id]
  authorize @post
  # Rest of your code
end