我有一个评论模型,我想在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
答案 0 :(得分:0)
通过这种方式,您可以将与模型交互的逻辑与控制器分开,为此,最好尽量保持简约。
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件:
edit
和destroy
)添加逻辑,以确保他们在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
这只是一个非常草拟的例子。一旦完成所有工作,然后将逻辑提取到模型上的方法中(以减少冗余)等等。
祝你好运!