2012-12-29 84 views
2

我有2個模型 - 用戶模型和配置文件模型。我已經安裝的關係如下:Rails路由和模型問題

class User 
    has_one :profile 
end 

class Profile 
    belongs_to :user 
end 

我有4個動作型材控制器 - 新創建的編輯和更新。一旦用戶註冊或登錄,他將被重定向到配置文件控制器中的新動作。從這裏我如何創建該用戶的配置文件?具體來說,我應該在「新建」操作和「創建」操作中擁有什現在,新操作的路由只是profiles/new,它不捕獲用戶參數。我試圖做到這一點,但它的失敗。

型材控制器

def new 
    @user = User.find(params[:id]) 
    @profile = @user.build_profile 
    end 

    def create 
    @profile = current_user.build_profile(params[:profile]) 
    if @profile.save 
     redirect_to current_user 
    else 
     render new 
    end 
    end 
+0

它是如何下降以及你的路線如何? –

+0

它說無法找到沒有身份證的用戶。本質上,配置文件#new的路由是localhost:3000/profiles/new。沒有用戶名在這裏傳遞。不知道我是否應該改變路線。我正在使用設計進行身份驗證,以便創建用戶並將其重定向到配置文件#new。我不知道從這裏開始做什麼。 – pratski

+0

我想我想弄清楚的是,如果我需要在新操作中捕獲用戶標識。我可以做這樣的事嗎? def new @profile = current_user.build_profile – pratski

回答

2

在配置控制器的new行動並不需要得到來自PARAMS用戶的id。 所以,你的控制器會是這樣

def new 
    @user = current_user 
    @profile = @user.build_profile 
end 

def create 
    @profile = current_user.build_profile(params[:profile]) 
    if @profile.save 
    redirect_to current_user 
    else 
    render new 
    end 
end 

實際發送用戶的idnew操作可能是一個安全漏洞,因爲我可以送其他用戶的id並創建一個配置文件在其他一些用戶系統,這是不應該被允許的。

+0

現在我做了一些研究,我發現了這個奇異嵌套資源的概念。這不是做事情的首選方式嗎?我只需要使用cancan進行授權,但我認爲現在路線更有意義。/users/id/profile/new或/ users/id/profile/edit。有什麼想法嗎? – pratski

+1

它肯定會更有意義,但你會遇到同樣的問題,用戶可能會發送另一個用戶的ID,你仍然必須使用'current_user'而不是從params中獲得用戶'id',所以使用嵌套資源但在'profile'的情況下仍然使用'current_user' – Khaled

2

你不應該在你的新動作中使用User.find(params[:id]

就像在您的創建操作下面,您應該得到Usercurrent_user

難道還有更多的問題比不能正確取得User