Rails 3 - 使用Ajax加载Subnav ....哪个控制器拥有一个subnav?

时间:2010-09-26 02:25:49

标签: ruby-on-rails ruby-on-rails-3

加载Rails 3应用程序后,用户可以单击需要加载动态子空间的项目。

我的想法是(因为它需要是动态的)是onClick对服务器进行jQuery AJAX调用,然后将HTML响应注入到页面上的DIV中......

我希望你的建议是subnav逻辑应该如何/在rails应用程序中存在,因为我没有导航控制器或视图......但也许我应该有一个?

我是否要创建导航控制器?或者使用应用程序控制器?我还有一个页面控制器,我用它来登陆页面,关于,联系等...

谢谢!

1 个答案:

答案 0 :(得分:1)

对我来说,我会使用导航控制器而不是应用程序控制器,因为应用程序控制器的增长非常复杂。

这应该在app/views/navigation中创建一个视图文件夹。我也会在这里放置所有导航模板(包括你的主导航)。

所以可能会有这些文件:

app/views/navigation/
  _main_nav.html.erb # made it a partial file for including in other pages
  subnav.html.erb # or subnav.js.erb if you don ajax call and return scripts

并在您希望主导航的布局文件中,您只需渲染它。

所以即使明天你突然想要两到三个不同的导航菜单,并且有ajax调用,你有一个集中的地方来处理它们,而不是把它们都放在应用程序控制器里。

另一个建议是,在某些范围内生成导航控制器。与app/controllers/page_structures/navigation_controller.rb一样,您的观看次数将在app/views/page_structures/navigation/

通过这种方式,您可以将所有与页面结构相关的内容(如侧边栏,自定义标题,横幅等)放在同一范围page_structures中。

=====更新=====

由于您的AJAX调用似乎相对静态,我建议您的路径使用某种直接匹配。

如果我的猜测正确,您的顶部导航有一些项目,每个项目都有自己的子菜单。因此,您需要逐个加载子菜单,但不是全部。 (如果实际上是全部,那么你可以将它们全部包含在渲染中......)

/page_structures/:top_nav/:sub_nav_template_name # So in here I assumed you will have many navigations and sub-nav to load.

然后我们将此路径与以下操作匹配:

def get_sub_nav
  # checks both params[:top_nav] and params[:sub_nav_template_name] exist and not pointing to some other dangerous place. (I don't know if this work if the input is './' or '../' these kind of things
  render "page_structures/navigation/#{params[:top_nav]}/#{params[:sub_nav_template_name]}"
end

通过这个简单的操作,每当您添加更多导航/导航项时,您只需要创建相应的AJAX响应模板。通过这种方式,你正在做最小的事情!

当然,如果某些项目如何将某些其他数据作为响应返回,例如响应子类别,则可能需要创建其他路由以允许您传递父类别ID。

你可以这样想:我的建议是默认的相对静态的集中式子导航 但是如果你需要一些专门的子导航,需要其他数据来处理,你需要在导航控制器中创建路线和动作来接受你的类别ID,产品ID等。但是,这些模板仍然是文件可以遵循相同的备案方式。