【问题标题】:Rails Application StructureRails 应用结构
【发布时间】:2011-08-02 14:41:03
【问题描述】:

我正在开发一个 Rails 应用程序,对 MVC 和 REST 有点陌生。我正在尝试使用这些方法,但有几个问题:

  1. 我需要有不直接对应于“资源”的导航链接。假设它们是“仪表板”、“交易”和“余额”。如何在控制器中对此建模?我是否只有一个用于“导航”的控制器,它具有三个操作,一个用于上述每个单词?
  2. 如果这是对应用程序建模的合理方法,我想我会匹配显示 /dashboard => Navigation#Dashboard 的路由,因为我不想在 URL 中公开“导航”一词。这看起来不错,但是在服务器中,当我渲染“仪表板”时,URL 显示“导航/仪表板”而不是“仪表板”,因为我直接调用了它。我发现的唯一解决方法是重定向到“/dashboard”,但这似乎是错误的。

谢谢!

编辑: 真正的问题是,当有人转到“登录”并且出现验证错误时,我想显示错误,并呈现 session#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

【问题讨论】:

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


    【解决方案1】:

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

    #routes.rb
    
    match "/dashboard" => "navigation#dashboard", :as => "dashboard"
    

    通过定义:as => "dashboard",您将获得dashboard_path

    更新

    你不能做render dashboard_path。如果你在NavigationController,你可以做render 'dashboard',否则你必须同时指定文件夹render 'navigation/dashboard'

    您应该在您的视图中创建一个名为 navigation 的文件夹和一个名为 dashboard 的模板。

    在您的 NavigationController 中:

    class NavigationController < ApplicationController
      def dashboard
        ...
      end
    end
    

    使用链接:&lt;%= link_to 'Dashboard', dashboard_path %&gt;

    更新 2

    我没有看到您为登录创建的表单。我假设您正在使用设计。如果是这种情况,请确保您的登录表单发布到 signin_path

    【讨论】:

    • @dombesz - 是的,但按照我的理解,我只能使用“redirect_to dashboard_path”,但我需要执行“render dashboard_path”,但这不能正常工作。跨度>
    • @dombesz - 所有这些都是有道理的。我的问题的根源是我是否可以调用'render [something]'并将其渲染到页面而不将浏览器中的uri更改为'导航/仪表板',因为我想隐藏'导航'部分网址并将其设为“site.com/dashboard”。当我渲染任何东西时,该操作会显示“/controller/action”的默认路径,我不想重定向到,因为这是来自浏览器的另一个调用。我希望这是有道理的。感谢您迄今为止的帮助。
    • @skaz 如果你只写dashboard_path,它应该是/dashboard。请注意,在路由中,match '/dashboard' 不应嵌套在任何资源中。它应该在根级别。
    • @dombesz - 当我使用dashboard_path 时,我确实得到了/dashboard。问题是我只能在重定向上使用dashboard_path,它将“重定向”发送到浏览器,然后浏览器发出另一个请求。我真正想解决的情况是,假设页面验证失败,我想在页面上显示“有问题”验证。在这种情况下,我只想渲染内容并将其发送下来。在这种情况下,我不能使用dashboard_path。如果我使用“仪表板”,我会得到错误的 URI。
    • @skaz 所以你想把一些东西发布到dashboard_path,并验证它?在渲染的情况下,url 不会改变。当您在表单上点击提交时,该 url 会更改,并将更改为您在表单操作中指定的那个。因此,您可能必须为您的帖子表单指定一个漂亮的 url。也许只是dashboard_path。不看代码很难说。我建议用一些代码更新你的问题。
    【解决方案2】:

    1 - 我不清楚你在问什么。但是,如果我正确地回答了您的问题,则应该有 3 个资源(控制器)用于

    1 - 仪表板

    2 - 交易

    3 - 余额

    那里的控制器可能只有显示动作

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

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      当我实现仪表板时,我使用DashboardController,而index 只是仪表板。我通常还会定义一个HomeController,主页所在的位置(home#index,还有关于页面、反馈页面……)。

      【讨论】:

        【解决方案4】:

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

        对于第二部分,你试过了吗:

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

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

        【讨论】:

        • 感谢您的回复。针对第二部分,我的 routes.rb 中有匹配项,但是当我在导航控制器中时遇到了问题。如果回发有错误,我会显示错误并尝试通过“render 'dashboard'”重新渲染页面。但是,这会将用户浏览器中的 uri 更改为 /navigation/dashboard 而不是我想要的 - /dashboard。
        • 还有其他导航路线#dashboard 吗?如果是这样,请尝试交换它们的顺序,以便首先找到匹配项。 (可以使用 rake routes | grep dashboard 查看是否有这样的映射。)
        • 不,只有一条路线。我认为问题在于调用“render 'dashboard'”甚至都懒得去routes.rb,因为我正在定义一个动作,所以它直接去那个动作并且没有重定向。也许我想错了。
        猜你喜欢
        • 2014-12-09
        • 1970-01-01
        • 2012-04-21
        • 2011-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多