锁定编辑并销毁Ruby on Rails

时间:2015-05-01 18:56:20

标签: ruby-on-rails ruby

我有一个评论模型,我想在30分钟后锁定编辑和销毁按钮,如果只有正确的用户。现在我只是在按钮周围有一个if语句,但你仍然可以通过输入完整的URL来实现它。我在哪里/怎么做这个?我是Ruby on Rails的新手,任何帮助都很有用。提前谢谢!

编辑:我所拥有的只是在索引的下方,但问题是我仍然可以通过URL获取它,我不知道如何在那之后无法访问它们。

<% if signed_in? %>
          <% if current_user.id = review.user_id %>
            <% if !review.has_time_passed? %>
              <td><%= link_to 'Edit', edit_property_review_path(review.property,   review) %></td>
                <% if !review.comments.any? %>
                  <td><%= link_to 'Destroy', [review.property, review], :confirm => 'Are you sure?', :method => :delete %></td>
                <% end %>
              <% end %>
            <% end %>
          <% end %>

我的has_time_passed方法:

def has_time_passed?
    created_at < 30.minutes.ago
  end

2 个答案:

答案 0 :(得分:0)

我的建议是引入授权框架,例如PunditCancan

通过这种方式,您可以将与模型交互的逻辑与控制器分开,为此,最好尽量保持简约。

Pundit和CanCan都有很棒的教程,展示了如何实现与你想要实现的类似的场景。

例如,在Pundit,您的政策有点像这样:

class MyModelPolicy
  attr_reader :user, :my_model

  def initialize(user, model)
    @user = user
    @my_model = model
  end

  def destroy?
    user == my_model.user && my_model.created_at < 30.minutes.ago
  end
end

答案 1 :(得分:0)

我认为你所描述的内容至少有2件:

  1. 您需要确保视图模板在30分钟后隐藏任何编辑和销毁链接。
  2. 您需要为相关控制器操作(editdestroy)添加逻辑,以确保他们在30分钟后拒绝进行任何更改。
  3. 就观点逻辑而言,听起来你非常接近,这不应该太难。一个if语句浮现在脑海中(类似于您上面粘贴的内容,但更简单一点):

    if review.created_at <= 30.minutes.ago
    

    然后,在控制器中,您还需要确保操作仅在时间限制内进行更改。例如,您可以使用相同的if语句:

    def edit
      if review.created_at <= 30.minutes.ago
        redirect_to some_other_path, alert: "Sorry bro, this review is too old to be edited."
      else
        # do stuff
      end
    end
    

    这只是一个非常草拟的例子。一旦完成所有工作,然后将逻辑提取到模型上的方法中(以减少冗余)等等。

    祝你好运!