Rails应用程序结构

时间:2011-04-10 19:09:44

标签: ruby-on-rails model-view-controller rest

我正在开发一个Rails应用程序,对MVC和REST来说是一些新东西。我正在尝试使用这些方法,但有几个问题:

  1. 我需要导航链接不直接与“资源”对应。假设它们是“仪表板”“交易”和“余额”。如何在控制器中对此进行建模?我是否只有一个“导航”控制器,它有三个动作,一个用于上面的每个单词?
  2. 如果这是一个合理的方式来建模应用程序,我想我会制作匹配路线,说/ dashboard =>导航#Dashboard,因为我不想在URL中显示“导航”一词。这似乎很好,但是当我做渲染“仪表板”时,在服务器中,URL显示“导航/仪表板”而不仅仅是“仪表板”,因为我直接调用它。我发现的唯一工作是重定向到'/ dashboard',但这似乎不对。
  3. 谢谢!

    编辑: 真正的问题是,当有人进入“登录”并且存在验证错误时,我想显示错误,并呈现会话#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
    

4 个答案:

答案 0 :(得分:3)

对于问题的第一部分,我经常发现自己处于这样一个位置,即网站的“实用”功能无法很好地映射到资源上。通常,我会将它们粘贴在某种实用控制器中。您可以尝试使用DashboardController并定义方法navigationbalancestransactions等等。

对于第二部分,您是否尝试过:

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

这应该适用于您描述的内容。如果您还没有,请阅读有关路由的Rails指南:http://guides.rubyonrails.org/routing.html

答案 1 :(得分:1)

使用导航控制器很好。在您的路线中,您可以为其定义自定义名称。

#routes.rb

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

通过定义dashboard_path

,您将获得:as => "dashboard"

<强>更新

你不能render 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

答案 2 :(得分:0)

1 - 我不会放弃你的要求。但如果我正确地得到你的问题,那么

应该有3个资源(控制器)

1 - 仪表板

2 - 交易

3 - 余额

并且控制器可能只有show action

2-为此您可以使用命名路由(http://guides.rubyonrails.org/routing.html)    例如:match 'Navigation' => 'Dashboard#show'

希望这会有所帮助

答案 3 :(得分:0)

当我实施信息中心时,我使用的是DashboardController,而index只是信息中心。我通常还会定义一个HomeController,其中主页位于home#index,还有关于页面,反馈页面......)。