2016-05-08 177 views
-1

我是新來的rails和我使用引導簡單的形式來更新用戶的信息,但它不斷調用錯誤的控制器。Rails窗體調用錯誤的方法

代碼形式:

def update 
    if @user.update(user_params) 
    redirect_to home_path 
    else 
    redirect_to wrong_path 
end 

守則路線:

simple_form_for(@user) do |f| 
= f.input :forename 
= f.input :surname 
.form-actions 
    = f.button :submit, :method => :update 

在控制器代碼

resources :user do 
    member do 
    post :update 
    end 
end 

但在另一個頁面我在再次使用形式不同的控制器調用AdminControllerupdate窗體調用AdminController而不是UserController

我需要做什麼來得到它來調用正確的控制器/

回答

2

的錯誤不是形式,而是缺乏對路由的RESTful如何在軌工作的認識。

在rails慣例中,您通過發送PATCH請求來更新記錄。

PATCH /users/:id => user#update 

事實上,當你聲明的路徑:

resources :users 

Rails的創建路徑爲您服務。請注意,名稱應該是複數!這同樣適用於控制器UsersController而不是UserController

當你創建一個表單,並通過資源,像這樣:

# sugar on top of form_for 
simple_form_for(@user) do |f| 

Rails會看記錄,並試圖找到基於該約定的相應的路由。您不需要指定方法,因爲Rails會查看模型是否已被保留。

如果你出於某種原因確實需要指定HTTP方法,請在<form>元素上執行 - 而不是在提交按鈕上。

simple_form_for(@user, method: :patch) do |f| 

另外處理的更新路由的傳統方法是:

def update 
    if @user.update(user_params) 
    redirect_to home_path 
    else 
    render :edit 
    end 
end 

你不想失敗的表單提交後重定向 - 用戶將丟失任何數據輸入到表格。而是你想重新渲染表單。

+0

這可能聽起來很愚蠢,但我不知道我在做什麼。我必須在路線中添加PATCH行嗎? –

+0

否 - 更改路線以僅讀取'resources:users' – max