2011-08-18 80 views
2

我有一個關於爲我正在工作的應用程序的特定部分構建寧靜設計的最佳方式的問題。寧靜設計的建議?

上的應用程序的一些背景:

User has_one :settings_for_email 

有一個profile_controller,其中有一個show動作..喜歡的東西:

def show 
    @user = current_user 
end 

最初,這是設置,使形式會後回到配置文件控制器..類似於:

<% form_for profile_path(@user) do |f| %> 
    <% f.fields_for :settings_for_email do |s| %> 
    <% ... form fields ... %> 
    <% end %> 
<% end %> 

而profile_controller更新動作做了這樣的事情:

def update 
    @user = User.find(params[:id]) 
    @user.settings_for_email.update_attributes(params[:user][:settings_for_email]) 
end 

....

我不喜歡這一點,因爲它有一個漏洞,允許用戶記錄正在編輯的改變...改變,要成爲@ user = current_user,對我來說沒什麼意義,因爲它是一個需要ID的更新操作。所以去/ profile/123或profile/456會產生相同的用戶記錄(因爲它將使用current_user, params [:id]將是多餘的)..這對我來說似乎很奇怪。

作爲便箋,我需要一個控制器操作來將用戶的電子郵件設置重置爲默認值。

所以,我落得這樣做作出新的路線:

resource :settings_for_email, :only => :create do 
    post :reset, :on => :member 
end 

,然後創建一個settings_for_email_controller:

#settings_for_email_controller.rb 
def create 
    current_user.settings_for_email.update_attributes(params[:settings_for_email_controller]) 
    redirect_to profile_url 
end 

def reset 
    current_user.reset_settings_for_email! 
    redirect_to profile_url 
end 

...

但後來我想,可以這有什麼改進?

如果我真的想使這個100%的寧靜,那會是最好做:

#update_settings_for_email_controller: 
def create 
    current_user.settings_for_email.update_attributes(params[:settings_for_email_controller]) 
redirect_to profile_url 
end 

#reset_settings_for_email_controller: 
def create 
    current_user.reset_settings_for_email! 
    redirect_to profile_url 
end 

我關於這個圍欄,因爲它似乎有點傻有兩個控制器這一點。但我想不出有更好的辦法去做。同樣,使用更新需要一個id,所以會被銷燬。我原本以爲使用destroy操作來執行「reset」會很好,但是再次......它會涉及浪費的id參數。所以我想我會在這裏問你們對於這種事情的想法?

回答

0

我認爲你在混合一些東西:這裏有兩個用戶。有細節需要改變的用戶,然後有用戶進行實際改變。通常,它們將是同一個,但並非總是如此:管理員可能需要重置某個用戶的密碼。

正在更改的用戶記錄的ID是應該進入REST界面的,並且User.find params[:id]應該照顧好就好了。

進行更改的用戶必須處理身份驗證(確保此用戶是她聲稱自己的用戶)和授權(是否允許用戶進行此更改?)。這是您撥打current_user時得到的用戶。寶石像devise幫助。

一般來說,您的控制器操作應該讓current_user和目標用戶確保當前用戶有權對目標用戶執行操作(因爲他們是同一用戶,當前用戶是admin或任何其他用戶其他邏輯你在你的應用程序),然後才執行該操作。

+0

從我理解你的意思,我的控制器動作應該是這樣的:user = User.find(params [:id]);如果用戶!= current_user; render:text =>「error !!!!!」;其他; user.update_attributes(PARAMS [:用戶]);結束 .... ?你是這個意思嗎?這似乎是一個愚蠢的條件檢查,因爲登錄用戶(current_user)將永遠是應該更新的記錄。 ? – patrick