2012-12-31 38 views
0

如何防止任何人提交表單?現在,任何用戶都可以更新任何其他用戶個人資料上的表單,他們只能觸摸他們的個人資料。Rails - 任何人都可以添加一個項目。不好

我應該只隱藏表單,如果它不在當前用戶的配置文件中,或者在控制器內部做一些更安全的事情?

例如,我有一個表格來創建一本新書。實際上,表單應該顯示的唯一時間是登錄用戶的個人資料頁面。表單應該隱藏在其他人的個人資料頁面上。

表:

<%= form_for @book do |f| %> 
    <%= f.hidden_field :user_id, :value => @user.id %> 
    <%= f.hidden_field :status, :value => "f" %> 
    <%= f.text_field :title, :placeholder => "Title" %> 
    <%= f.text_field :author, :placeholder => "Author" %> 
    <%= f.submit 'Add Book', :value => "" %> 
<% end %> 

編輯:

我開始使用慘慘,但仍不能限制創建對其他用戶的個人資料書籍的訪問。

我的新Ability.rb:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
     can :read, :all 
     can :create, Book 
    end 
end 

在應用控制器過濾器之前:

class ApplicationController < ActionController::Base 
    before_filter :current_user 

    def current_user 
    User.current = current_user 
    end 
end 
+0

你CURRENT_USER方法會導致一個無限循環,會是:這兩種方法添加到您的User模式?假設你使用的是像AuthLogic這樣的認證,你必須使用不同的名稱,比如'set_current_user' – bdares

+0

@bdares我正在使用Devise,抱歉應該提到這一點。它可能有預定義的名字吧? –

回答

1

您正在尋找授權方案。控制器邏輯是重要的部分(實際上允許或禁止該行爲),但視圖是用戶看到的,所以你應該實現這兩者。

雖然你可以推出自己的,CanCan是一個相對輕鬆的做法。

慘慘可以很容易地實現視圖邏輯(你仍然必須這樣做),這樣的:

<% if can? :create, Book %> 
<%= render '/books/form'%> 
<% end %> 

寶石創造者,瑞恩·貝茨,也是RailsCasts的創造者。方便的是,有一個covers CanCan

爲您的使用情況下,我會這樣定義的能力:

can :create, Book do |book| 
    book.user = User.current 
end 

你需要在應用程序控制器中添加的before_filter當前用戶放入User.current變量這個工作(訪問模型中的當前用戶)。不

def self.current 
    Thread.current[:user] 
    end 
    def self.current=(user) 
    Thread.current[:user] = user 
    end 
+0

現在簽出CanCan!它是否處理查看邏輯,比如隱藏表單呢? –

+0

這正是我所擁有的(如果可以<%:創建,預訂%>),但它仍然允許我在其他人的賬戶上創建書籍...... –

+0

Ryan的屏幕錄像並不真正涵蓋如何屏蔽*創建* (在他的情況下),但另一個用戶的(在他的情況下)。 –

2

隱藏的形式,並刪除USER_ID作爲一個字段。在控制器中,如果用戶有很多/一書(S),然後取該協會的優勢:

def create 
    @book = current_user.books.new(params[:book]) 
    ... 
end 

如果由於某種原因,形式卻意外顯示當前用戶只能夠添加自己的書。

相關問題