2011-04-10 153 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,以及关于页面,反馈页面......)。