2015-05-01 168 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