2015-10-06 55 views
0

我有兩個模型:UserDreamUserhas_many :dreamsDreambelongs_to :user。我有兩個用戶和夢想的控制器。我想創建新的Dreamform_for並參考特定的User。但它不應該由我指定,它應該以某種方式(並且這是我卡住的地方)追蹤哪個User的頁面我按"Create new dream",併爲此創建User如何創建一個參考父模型的新模型條目

我設法與僅使用用戶控制器(用於管理的夢想也一樣),與經過user_id參數中的URL要做到這一點,並與隱藏字段。但是我意識到這不是一個好的方法,因爲任何人都可以編輯URL或隱藏字段的值,併爲任何User創建新的Dream

我正在尋找一種方法來使兩個控制器在引擎蓋下相互溝通。或者,也許這不是我所需要的,我錯過了MVC或其他任何概念的細微差別。我需要有人把我推向正確的方向。

回答

1

如果您已經登錄功能,那麼您可以在ApplicationController定義一個方法,返回由請求中提供的會話令牌相匹配的用戶,然後做current_user.dreams.create(params),這將創造參照夢想哪個用戶是通過current_user返回並且絕不會將有關用戶的任何信息放入客戶端視圖中。

如果您沒有登錄功能,那麼我不會擔心它可以被編輯的事實,因爲那時任何人都可以通過訪問該頁面爲任何其他用戶創建夢想。

編輯:例如我經常用這樣的東西:

def current_user 
    @current_user ||= User.find_by(session_token: session[:session_token]) 
end 
1

您可以添加一個可選的user_id參數到DreamsController中的新動作。這是PARAM建立在該用戶的新夢想。

def new 
    user_id = params[:user_id] 
    @dream = if params[:id].present? 
      User.find(params[:id]).dreams.build 
      else 
      Dream.new 
      end 
end 

那麼你的鏈接將會像

<%= link_to "Create New Dream", {:controller => "dream", :action => "new", user_id: user[:id]}%> 
0

我認爲這是事情完成這樣那樣的方式。

爲:

任何人都可以編輯URL或者隱藏字段的值,並且對於任何用戶創造新的夢想

  • 如果您有單用戶通過在應用軟件,他可以做任何事情;他是superAdmin
  • 如果有多個用戶
    • 它們必須具有不同的角色; moderatorsuperadminadmin
    • 在這種情況下
    • ;單獨authentication不能做所有你所使用的authorization機制的一些方法類似cancancancancanpundit等的事情。
    • 這些基本上阻止任何用戶做一些令人討厭的事情,他們是未經授權的。

如果任何用戶修改了隱藏字段的值,你必須檢查他是否有權這樣做或沒有。