2012-07-13 25 views
1

我已經在我的Rails應用程序Rails的渲染命名爲正確的網址

match '/settings', to: 'Users#edit', as: 'settings' 

以下路線和相應的控制器代碼路徑

def edit 
    @user = current_user 
end 

def update 
    correct_user 
    @user = User.find(params[:id]) 
    if [email protected](params[:old_password]) 
    flash[:error] = 'Old password did not match' 
    redirect_to settings_path 
    elsif @user.update_attributes(params[:user]) 
    flash[:success] = "Settings updated" 
    redirect_to settings_path 
    else 
    render 'edit' 
    end 
end 

我的編輯頁面是爲現在只需一個密碼更改頁面,當我訪問/settings時,我看到除了我以外的頁面。當我redirect_to settings_path,網址仍然/settings,這是我想要的行爲。

在我的edit模板中,我有代碼來處理對象錯誤並將它們呈現在頁面上。當render 'edit時,如果出現對象錯誤,則會觸發此代碼。如果我重定向到頁面,但是,代碼不在那裏。所以我需要撥打render 'edit'來查看錯誤。

但是,撥打render 'edit'會導致URL更改爲/users/:id/edit,這正是我不需要想要的。在撥打render 'edit'之後,我希望URL保持爲/settings。我怎樣才能做到這一點?

注意:我已經搜索過網站和互聯網的其他部分,但沒有找到適合我的需求的東西。有一個或兩個SO主題有類似的問題,但他們都使用閃爍和哈克基於重定向的變通辦法,這不是我想要的。

回答

6

你想設置你的路線是這樣的:

match 'settings': 'users#edit', via: :get 
match 'settings': 'users#update', via: :put 

然後形式應該聲明如下:

<%= form_for @user, url: settings_path %> 

在您的控制器,請確保你調用render像這個:

render action: "edit" 
+0

這似乎是工作。謝謝! – mschallert 2012-07-13 20:29:02

1

你可能在你看來壞link_to,一個使用舊式:controller:action參數分開,而不是使用settings_path

請記住,如果存在到同一控制器和操作對的兩個路由,則定義的第一個路由具有優先級。首先定義您的自定義路線以確保默認使用它。