1

我们有一个简单的应用程序,它具有水平布局(左侧面板和右侧的内容),带有页眉和页脚。因此,如果您单击左侧的某个对象,则会在右侧呈现视图,并在页眉和页脚链接中使用导航面板。对于左侧的任何操作,布局实际上在同一页面上呈现内容,左侧的内容将根据标题中选择的部分而有所不同。在这些情况下,我们应该如何设计路线,这与每个动作都呈现在不同页面上的基本导航不同。

我的路线看起来像这样..

  resources :foos do
    resources :foo_bars do
    end
  end

我需要在左侧面板上显示所有 foos,如果用户选择 afoo它需要在右侧面板上的表格中显示foo和的属性。foo_bars视图将如何寻找我以及浏览器中的 URL 如何寻找我?我们将在顶部有几个选项卡,基于这些选项卡您将显示foos或类似的顶级对象

4

4 回答 4

1

If your question is:

how should we go about designing routes

The way you have it is just fine if you want to utilize nested resources, and in your case it seems logical. http://guides.rubyonrails.org/routing.html#nested-resources

Currently, your url will be as follows: /foos/:foos_id/foo_bars/some_action

Let me rename these so things make more sense. Lets say foos is categories, and foo_bars is actions.

Personally, I would override the to_param in the categories model file.

to_param
  #return a more readable attribute here
  name
end

In this way, your URL would be more closely tied with the names of all the categories on the left side of your page.

So now, if you had a record in the categories table which had the name animal, your URL would look like this: /categories/animal/actions/some_action

That seems pretty logical to me. Make sure in your controller you fetch the record via the proper attribute if you use to_param.

I would apply the same principal to the nested resource as well, then your whole URL would be accurately representing what tab is selected on the page. If you had a record in actions with the name "running", and you had things setup properly, then you could have your url look similar to: categories/animal/actions/running.

You could play around with all the options in your routes file, then use rake routes in terminal to see what changes and what your urls will look like before you even touch the browser.

Here are some extra resources for you.

http://apidock.com/rails/ActiveRecord/Integration/to_param http://guides.rubyonrails.org/action_controller_overview.html

Hope this helps.

于 2013-03-18T10:51:18.850 回答
1

路线保持不变。你需要ajaxify你的电话。

于 2013-03-12T13:31:09.870 回答
0

如果我正确理解您的问题,那么说需要 Ajax 的答案是不正确的。我有一个古老的 Perl 应用程序(写于 1999 年)可以做到这一点。我目前在 Rails 中重新实现,并且工作正常。框架使得在菜单保持固定时允许数据滚动变得特别容易。

您确实需要使用 HTML5 中已弃用的 HTML4 框架,可以将 IFRAME 用于数据呈现框架并符合 HTML5,但结果不如 HTML4 中的 FRAME 解决方案可用,至少在某些浏览器中是这样。

正如其他人所说,您的路线很好。

诀窍是使用 中的target字段form将提交响应定向到渲染帧。我的“命令”框架的haml代码是

= form_tag admin_menu_path, :method => :put, :target => 'data_frame' do
   ...

其余的只是一个正常的形式。这种形式在(我的情况)左框架中保持不变,而响应在右框架中相互替换data_frame

匹配的框架 HTML 是:

<frameset cols="360,*">
  <frame name="menu_frame" src="...">
  <frame name="data_frame" src="admin.htm">
</frameset>

您必须使用外部框架集来获取页眉和页脚,但这应该很简单。

我准备好接受评论说框架远非最佳实践。但是对于这个特定的应用程序,它们是完美的:简单、易于理解,并且非常独立于浏览器。例如,我 1999 Perl 生成的代码在 IE 2.0 和 Netscape(Firefox 的祖先,朋友们)上运行良好。在我能找到的每一个现代浏览器上,它仍然是完美的。希望阿贾克斯也能这么说……

如果我误解了您的问题,我很乐意删除此回复。

于 2013-03-22T00:03:16.167 回答
0

您的问题没有很好的答案 - 这完全取决于您的应用程序的布局。此外,这里有关于 to_param 和使用 AJAX 的有效答案,它们添加了重要的细节。但是,给你一个良好的开端。

对于您的视图/foos,将您的 index.html.erb 重写为:

<%= render partial: "show_foos", locals: { foos: @foos, selected_foo: nil }%>

而你的 show.html.erb 为:

<%= render partial: "show_foos", locals: { foos: @foos, selected_foo: @foo }%>

在 show 方法中的 foos_controller.rb 中,您需要同时获取 @foos 和 @foo,例如:

@foos = Foo.all
@foo = Foo.find(params[:id])

现在,到有趣的部分。返回views/foos 目录。创建一个名为“_show_foos.erb”的部分(我们从#index 和#show 调用的部分)。执行以下操作:

<table>
  <tr>
    <td>
      <%= render partial: "show_foos_list", locals: { foos: foos, selected_foo: selected_foo }%>
    </td>
    <td>
      <%= render partial: "show_foo_props", locals: { selected_foo: selected_foo }%>
    </td>
  </tr>
</table>

请注意,这是一个非常粗暴和丑陋的示例,它创建了一个包含两列的表:一列用于左侧“面板”中的 foo 列表,另一列用于在右侧“面板”中显示所选 foo 的结果。在现实生活中使用 div 和样式。此外,考虑将布局推送到它所属的位置 - 适当的布局文件 - 并在那里使用命名收益。但是,正如我所说,一个先机 - 简单的表。

现在,只需定义这里提到的两个部分。首先,“_show_foos_list.erb”列出了左侧的 foo。假设每个 foo 都有一个“title”属性,例如:

<% foos.each do |foo| %>
  <%= link_to_unless selected_foo && (foo.id == selected_foo.id), foo.title, foo %><br />
<% end %>

其次,右边的 foo & foo_bars - “_show_foo_props.erb”:

<% if selected_foo %>
  # Here display the Foo attributes
  <h2> Foo: <%= selected_foo.title %> </h2>
  <% selected_foo.foo_bars.each do |foo_bar| %>
    # Here display each FooBar that belongs to Foo
    <h3>FooBar <%= foo_bar.title %></h3>
    <%= foo_bar.description %>
  <% end %>
<% end %>

再次,非常粗略的例子。将 'title'、'description' 替换为正确的参数集,使用部分显示 FooBars。使用 CSS 进行样式设置。等等,等等……根据您的需要进行重构。

谈论路线。当您访问“www.yourapp.com/foos”网址时,您得到的是左侧所有 foo 的列表,右侧没有任何内容。按下左栏中的任何 foo 后,您将转到“www.yourapp.com/foos/:id”,其中 :id 是所选 foo 的 ID(并从此处的其他答案或更高级的技术中考虑 to_param使这部分有意义)并在左侧获取 foos 列表,在右侧获取所选 foo 和所有属于它的 foo_bars 的属性。

希望这有助于根据此处提出的粗略想法开始布局您自己的实现。

于 2013-03-21T22:15:34.113 回答