6

我正在开发一个 Rails 2.3.1 网站。在整个网站中,我需要有一个用于在各个页面(主页、创建帖子页面、帖子列表页面、评论列表页面等)上创建帖子的表单——我只想说这个表单需要在许多页面上各种控制器)。这些页面中的每一个都显示在相应的控制器/操作中检索到的各种其他信息。例如,主页列出了最新的 10 个帖子、从数据库中提取的内容等。

因此,我已将帖子创建表单移至其自己的部分中,并将此部分包含在所有必要的页面上。请注意,部分 POST 中的表单到 /questions(路由到 PostsController::create - 这是默认的 rails 行为)。

我遇到的问题是当 Posts 表单没有正确完成时,默认情况下 PostsController::create 方法会渲染问题/new.html.erb,即使表单是从主页提交的(/home/index.erb)。 html.erb)。

我尝试在部分中更改表单以提交“submitting_controller”和“submitting_action”,并在 PostsController::create 中,当 @post.save? == false,我渲染动作 =>“../submitting_controller/submitting_action”(这有点 hacky,但可以让您从非 PostsController 渲染动作)。

这在表面上似乎工作正常。不完整的表单在提交它的视图中呈现,并带有所有正确的@post.errors 消息等。问题是页面上的所有其他数据都没有显示,因为没有调用实际的 submit_controller/submitting_action 方法,只是关联的视图。(请记住,我做了一个保留实例对象的渲染,而不是不保留具有所有错误消息和提交值的 @post 实例对象的 redirect_to。)

据我所知,我有两个选择:

1)@post.save 时我可以将@post 对象存储在会话中吗?PostsController::create, redirect_to submit_controller/submitting_action 失败,此时我将@post 对象拉出会话并使用它重新填充表单/错误消息。(据我了解,在会话中存储对象在 Rails 中是不好的做法)

2)我可以将所有用于从各种submitting_controller/submitting_action中拉取非post创建表单数据的逻辑,放到ApplicationController中,在PostsController::create中为submitting_controller/submitting_action创建一个巨大的switch语句并调用其中的方法ApplicationController 来获取每个提交页面渲染所需的所有额外数据。

关于在 Rails 中执行此操作的最佳方法的想法?

4

2 回答 2

1

这与您通过使用 AJAX 从整页更新到更新页面部分的转变有关。您应该考虑很多事情,但最类似于 rails 的方法是将响应拆分为 AJAX 响应和纯 HTML 响应。查看此 ONLamp 文章此注册文章令人敬畏的使用 rails 的敏捷 Web 开发书。本质上,您的控制器呈现一个新的 div 替换包含提交部分结果的旧 div。

在你的问题中,你提到了两种方法,所以我会试着给你一些关于为什么和为什么不在这里的指示:

选项 1) 通过一些调整,这个选项还不错。主要的调整是将对象以序列化的形式存储在数据库中。然后简单地传递序列化对象的 ID。您的好处是会话数据被持久化,因此恢复会话更加整洁并且您的会话保持轻松。这样做的缺点是在您的数据库中拥有一桶会话垃圾会污染您的应用程序,您需要考虑如何使数据库中未使用的会话垃圾过期。我从来没有很好地看到这个结局......

Option2) Eeek 不在 application_controller 内!:) 说真的,把它作为你最后的武器。不过,您可以在帮助程序中弹出内容并访问控制器和视图中的这些方法。然而,这些东西的测试并不那么容易,所以在选择这条路线之前要小心。只需稍加思考,就可以在 OO 应用程序中替换 Switch 语句,当然在他的情况下,您可以使用选项散列来获得一种在发出请求时对应用程序状态进行一些智能处理的方法。

于 2009-10-12T02:37:25.397 回答
1

您的 Post 模型是否与您将用于呈现表单的每个模型的控制器存在belongs_to 关系?您是否在 Post 控制器中进行任何特殊处理Post.create(params[:post])

如果您对第一个问题的回答是“是”,而对第二个问题回答“否”,您可以通过将 Accepts_nested_attributes_for 添加到用户可以在其上创建帖子的每个控制器来以最小的方式解决问题。

无论如何,Robertpostill 是正确的,因为这可能是开始查看 AJAX 的时候,只是替换页面的部分。唯一的问题是如果用户禁用了 javascript,该怎么办。就个人而言,我喜欢为非 JavaScript 案例做设计并添加便利方法。

至于你认为你的两种选择的想法,

1) 我使用这种方法将对象的浅表副本存储在闪存哈希中。跨重定向保留它。但是,鉴于帖子的可变性,这可能对您不起作用。因为您只能发送大约 4K 的数据,并且除了浅拷贝之外还包括其他信息。

2) 查看 robertpostill 的回复

于 2009-10-12T03:02:37.150 回答