0

我有這樣一個模型:在沒有控制器的模型中是否需要質量保護?

class Page < ActiveRecord::Base 
    attr_accessible :page_id, :name, :page_url, :username 
end 

,它並沒有相關的控制器,但在其他控制器我執行此代碼:

fgraph = Koala::Facebook::API.new(ftoken) 

@pages = fgraph.fql_query("select XXX from pages where xxx") 

@pages.each do |p| 

    newpage = Page.find_or_initialize_by_page_id("#{p["page_id"]}") 
    newpage.update_attributes(
     name: p["name"], 
     username: p["username"], 
     page_url: p["page_url"] 
    ) 
end 

最後一行更新我的模型與facebook數據的數據。因爲我已經獲得了動作方法中的信息,所以我認爲這是不可能的,因爲我已經獲得了動作方法中的信息,但是我真的很喜歡使用rails,我想確認我的supossition是否屬實。

+0

如果該方法修改列表中提及的屬性之外的任何屬性,則rails將引發錯誤。如果不是,所有工作都會很好。它與控制器無關。您不能在代碼庫中的任何位置修改不可訪問的屬性。 – Arindam 2013-02-12 21:00:51

+0

此方法正在修改Page類中的所有屬性。他們必須是可以訪問的,因爲我需要在這個班上寫一些來自Facebook的信息。在代碼中沒有PagesController或pages#update方法,只有這個。 – 2013-02-13 06:28:27

+0

這是一個極好的答案:[http://stackoverflow.com/questions/2652907/what-is-difference-between-attr-accessibleattributes-attr-protectedattrib/2652919#2652919][1] [ 1]:http://stackoverflow.com/questions/2652907/what-is-difference-between-attr-accessibleattributes-attr-protectedattrib/2652919#2652919 – 2013-02-13 06:55:09

回答

0

是的。 確實,列入白名單的屬性可以是從其他任何地方更新,並進行批量分配。

update_attributes是一種rails方法,它接收attr值對的哈希值並嘗試將其應用於對象並保存。在save成功返回之前,運行全部model validations以查看是否可以執行保存操作。

由於你的情況,更新是針對列入白名單的字段,你的方法運行良好。您的方法嘗試更新任何其他屬性的日子,例如date_of_birth,該方法將失敗,說明date_of_birth無法進行大規模更新。

爲了數據的安全性,您最好在寫入時或讀取時使用rails-sanitizers。這將確保在表中

  1. 數據呈現的是可讀的,不難看(其中一些用戶輸入趨於)
  2. 數據是HTML安全
  3. 不會引起任何形式的code-injections
相關問題