ruby-on-rails - 在多个页面上使用相同表单的 Rails 最佳实践

标签 ruby-on-rails ruby forms actioncontroller

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

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

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

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

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

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

1) 我可以在@post.save 时将@post 对象存储在 session 中吗?在 PostsController::create、redirect_to submitting_controller/submitting_action 中失败,此时我将 @post 对象从 session 中拉出并使用它重新填充表单/错误消息。 (据我所知,在 session 中存储对象在 rails 中是错误的做法)

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

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

最佳答案

您的 Post 模型是否有可能与您将用来呈现表单的每个 Controller 模型处于 belongs_to 关系中?除了 Post.create(params[:post]) 之外,您是否在 Post Controller 中进行任何特殊处理?

如果您对第一个问题的回答是肯定的,而对第二个问题的回答不是,您可以通过将 accepts_nested_attributes_for 添加到用户可以在其上创建帖子的每个 Controller 来以最少的修改来解决问题。

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

至于你认为你的两个选择是什么,

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

2) 查看 robertpostill 的回复

关于ruby-on-rails - 在多个页面上使用相同表单的 Rails 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1552169/

相关文章:

forms - 使用 VBA 模块从 Access 中的表单中获取文本值

ruby-on-rails - 学习 Ruby on Rails 对 Grails 有什么好处?

ruby-on-rails - Rails 3.1 应用程序未定义 JST

ruby-on-rails - Rails 3.0 发送邮件安全最佳实践

ruby - 字符串中的字母计数,Ruby

ruby - 寻找完美平方算法的优化

javascript - 基于 CheckBox 启用或禁用按钮

php - 如何在没有 Ajax 的情况下使用 Google Wallet 而不是像 Paypal 一样提交表单?

ruby-on-rails - Ruby on Rails : how do I use a default placeholder thing in a select_tag?

ruby-on-rails - 使用 Sinatra 和 Datamapper 的虚拟属性