2011-04-10 186 views
0

我正在使用Rails應用程序,並且對MVC和REST有點新。我試圖使用這些方法,但有幾個問題:Rails應用程序結構

  1. 我需要導航鏈接不直接對應「資源」。假設他們是「儀表板」「交易」和「餘額」。如何在控制器中對此進行建模?我是否只有一個「導航」控制器,它有三個操作,一個用於上面的每個單詞?
  2. 如果這是模擬應用程序的合理方式,我想我會製作匹配路線,說/ dashboard => Navigation#Dashboard,因爲我不想在URL中公開單詞「導航」。這看起來不錯,但在服務器中,當我執行渲染「儀表板」時,由於我直接調用它,因此URL顯示爲「導航/儀表板」而不是「儀表板」。我發現的唯一工作是重定向到'/ dashboard',但這似乎是錯誤的。

謝謝!

編輯: 真正的問題是,當有人去「登錄」,並且存在驗證錯誤時,我想顯示錯誤並呈現會話#new(這是頁面中的登錄)視圖。這會導致瀏覽器轉到/ sessions/new,但我希望它進入/ signin。我想避免使用redirect_to,因爲這會導致瀏覽器執行整個第二頁請求,這似乎不是「正確的」。

#routes.rb 
match '/signin', :to => "sessions#new", :as => :signin 

#sessions_controller.rb 

def create 
    @title = "Sign In" 
    user = User.authenticate(params[:session][:email], params[:session][:password]) 

    if user.nil? 
     flash[:error] = "Invalid email/password combination." 
     #I want to use render 'new', but that changes the URI in the browser to sessions/new, whereas I want to maintain /signin without redirecting 

     redirect_to signin_path 
    else 
     sign_in user 
     redirect_to dashboard_path 
    end  
end 

回答

1

使用導航控制器很好。在您的路線中,您可以爲其定義自定義名稱。

#routes.rb 

match "/dashboard" => "navigation#dashboard", :as => "dashboard" 

您將通過定義:as => "dashboard"

更新

你不能這樣做render dashboard_path得到dashboard_path。你可以做render 'dashboard'如果你是在NavigationController,否則你必須指定文件夾以及render 'navigation/dashboard'

你應該在你的意見的文件夾名爲navigation一個叫做dashboard模板。

在你NavigationController:

class NavigationController < ApplicationController 
    def dashboard 
    ... 
    end 
end 

若要使用的鏈接:<%= link_to 'Dashboard', dashboard_path %> 希望這回答了你的問題。

更新2

我沒有看到你的sign_in創建窗體。我假設你正在使用設計。如果是這種情況,請確保您的登錄表單發佈到signin_path

+0

@dombesz - 是的,但是我理解它的方式,然後我只能使用「redirect_to dashboard_path」,但我需要執行「render dashboard_path」,但這不能正常工作。 – skaz 2011-04-10 23:42:23

+0

@skaz請參閱我的更新回答 – dombesz 2011-04-11 00:21:30

+0

@dombesz - 所有這些都有道理。我的問題的根源在於我是否可以調用'render [something]'並將該頁面呈現到頁面而不會將瀏覽器中的uri更改爲'navigation/dashboard',因爲我想隱藏「導航」部分該網址,並使其只是'site.com/dashboard'。當我渲染任何東西時,該動作顯示'/ controller/action'的默認路徑,我不想redirect_to,因爲這是來自瀏覽器的另一個調用。我希望這是有道理的。感謝您的幫助。 – skaz 2011-04-11 11:59:41

0

1 - 我並不放棄你要問的問題。但是,如果我正確地得到您的問題,應該有3個資源(控制器)爲

1 - 儀表板

2 - 交易

3 - 平衡

而且控制器可能只顯示行動

2 - 對於您可以使用一個名爲路線(http://guides.rubyonrails.org/routing.html) 例如:match 'Navigation' => 'Dashboard#show'

希望這有助於

3

對於問題的第一部分,我經常發現自己處於一個位置,該位置存在沒有良好映射到資源上的「實用」功能。通常,我將它們粘在某種實用控制器中。您可以嘗試DashboardController並定義方法navigation,balancestransactions等。

對於第二部分,你有沒有嘗試:

match '/dashboard' => 'navigation#dashboard' 

這應該爲你的描述工作。如果你還沒有,你應該閱讀Rails指南路由:http://guides.rubyonrails.org/routing.html

+0

感謝您的回覆。解決第二部分問題時,我在routes.rb中找到了這個匹配項,但是當我在導航控制器中時遇到問題。如果回發時發生錯誤,我會顯示錯誤並嘗試通過「渲染」儀表板重新渲染頁面。「但是,這會將用戶瀏覽器中的uri更改爲/ navigation/dashboard而不是我想要的/ dashboard。 – skaz 2011-04-10 19:54:50

+0

是否有另一條導航#儀表板的路線?如果是這樣,請嘗試交換它們的順序,以便首先找到匹配項。 (你可以使用rake routes | grep dashboard來查看是否有這樣的映射。) – 2011-04-10 20:19:28

+0

不,只有一條路由。我認爲問題在於,調用「渲染」儀表板「」甚至不打擾到routes.rb,因爲我正在定義一個動作,所以它直接進入動作並且沒有重定向。也許我在想它是錯的。 – skaz 2011-04-10 21:36:26

0

當我實施儀表板時,我使用的是DashboardController,而index只是儀表板。我通常還會定義一個HomeController,其中主頁的居住地(home#index,以及關於頁面,反饋頁面......)。