Ruby on rails Rails 3-使用Ajax加载子AV。。。。哪个控制器拥有subnav?

Ruby on rails Rails 3-使用Ajax加载子AV。。。。哪个控制器拥有subnav?,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,加载my Rails 3应用程序后,用户可以单击需要加载动态子AV的项目 我的想法是(因为它需要是动态的)单击onClick向服务器发出jqueryajax调用,然后将HTML响应注入页面上的DIV中 我想要你的建议是subnav逻辑应该如何/在rails应用程序中存在,因为我没有导航控制器或视图。。。但也许我应该有一个 我是否创建导航控制器?还是使用应用程序控制器?我还有一个页面控制器,用于登录页面、关于、联系人等 谢谢 对于我来说,我会使用导航控制器而不是应用程序控制器,因为应用程序控制器非

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

我的想法是(因为它需要是动态的)单击onClick向服务器发出jqueryajax调用,然后将HTML响应注入页面上的DIV中

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

我是否创建导航控制器?还是使用应用程序控制器?我还有一个页面控制器,用于登录页面、关于、联系人等


谢谢

对于我来说,我会使用导航控制器而不是应用程序控制器,因为应用程序控制器非常容易变得复杂

这将在
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\u structures/navigation\u controller.rb
,因此您的视图将位于
app/views/page\u structures/navigation/

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

====更新=====

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

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

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

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等。但是,这些模板文件仍然可以遵循相同的归档方式。

对于我来说,我会使用导航控制器而不是应用程序控制器,因为应用程序控制器很容易变得非常复杂

这将在
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\u structures/navigation\u controller.rb
,因此您的视图将位于
app/views/page\u structures/navigation/

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

====更新=====

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

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

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

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等。但是,这些模板文件仍然可以遵循相同的归档方式。

非常酷,我现在要尝试一下。。。既然我正在打一个AJAX电话来获取subnav,你对路线有什么建议/page_structures/nav/subnav/?因为这些AJAX调用路径通常是供内部使用的,不向公众开放(最有可能是post请求),所以我至少不介意它们如何显示。使用难看且难以猜测的路径可能会略微增加安全性问题……为了简单起见(因为您的调用看起来只是获取模板,而不是保存或销毁任何内容),因此我建议使用一些直接映射来最小化工作量。请看我的更新…很酷,我现在就去试试。。。既然我正在打一个AJAX电话来获取subnav,你对路线有什么建议/page_structures/nav/subnav/?因为这些AJAX调用路径通常是