2015-05-01 206 views
1

我有一个审查模型,我想在30分钟后锁定编辑和销毁按钮,如果只有正确的用户。现在我只是在按钮周围有一条if语句,但您仍然可以通过输入完整的URL来实现。我在哪里/如何去做这件事?我是Ruby on Rails的新手,任何帮助都很有用。提前致谢!锁定编辑并销毁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 
+0

你可以发布一些代码,显示你已经做了什么,试图实现这一目标吗? – bear

+0

我更新了帖子。 –

+1

我看到了你的帖子标题,并想到“为什么这个人讨厌Ruby on Rails?” –

回答

0

有至少2个到什么,我认为你所描述的:

  1. 您需要确保视图模板在30分钟后隐藏任何编辑并销毁链接。
  2. 您需要为相关控制器操作(editdestroy)添加逻辑以确保他们在30分钟后拒绝进行任何更改。

就视图逻辑而言,这听起来像你很接近,这应该不会太困难。我想到的一个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 

这只是一个非常粗略的示例。一旦你有所有的工作,然后提取逻辑到模型的方法(以减少冗余)等等。

祝你好运!

+1

我不能投票,但这确实有帮助。谢谢! –

+0

太棒了,很高兴听到它!即使您无法投票,我认为您仍然可以将其标记为已接受的答案。 –

0

我的建议是引进像PunditCancan的授权框架。

通过这种方式,您可以将与模型交互的逻辑与控制器分离开来,为此尽可能保持模型的简洁性。

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

在权威人士,例如,您的策略想有点像这样:

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 
0

我想你想要的东西在控制器级别。

# app/controllers/reviews_controller.rb 
class ReviewsController 
    before_action :validate_change, only: [:edit, :update, :destroy] 

    def edit 
    # edit stuff 
    end 

    def destroy 
    # destroy stuff 
    end 

    private 

    def validate_change 
    if @review.created_at < 30.minutes.ago 
     redirect_to request.env['HTTP_REFERER'] 
    end 
    end 
end