我正在开发一个 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/