我正在开发一个Rails 2.3.1网站。在整个网站上,我需要有一个表格,用于在各个页面上创建帖子(主页,创建帖子页面,帖子列表页面,评论列表页面等等) - 足以说明这个表格需要在许多页面上提供服务。各种控制器)。这些页面中的每一个都显示在相应的控制器/动作中检索的各种其他信息。例如,主页列出了最新的10个帖子,从数据库中提取的内容等。
所以,我已经将Post创建表单移动到它自己的partial中,并将其部分包含在所有必需的页面上。请注意,Partial POSTs中的表单为/ questions(路由到PostsController :: create - 这是默认的rails行为)。
我遇到的问题是当Posts表单没有正确完成时,默认情况下PostsController :: create方法呈现的问题/ new.html.erb,即使表单是从主页提交的(/ home /index.html.erb)。
我尝试更改部分中的表单以提交“submitting_controller”和“submitting_action”,并在PostsController :: create中,当@ post.save? == false,我渲染动作=> “../submitting_controller/submitting_action”(这有点hacky,但允许你从非PostsController渲染动作)。
表面看起来似乎没问题。不完整的表单在视图中呈现,提交了所有正确的@ post.errors消息等。问题是页面上的所有其他数据都没有显示,因为实际的submitting_controller / submitting_action方法没有被调用,只是相关的观点。 (记住,我做了一个保留实例对象的渲染,而不是一个不保留@post实例对象的redirect_to,它包含所有错误消息和提交的值。)
据我所知,我有两种选择:
1)@ post.save时我可以在会话中存储@post对象吗?在PostsController :: create,redirect_to submitting_controller / submitting_action中失败,此时我将@post对象拉出会话并使用它来重新填充表单/错误消息。 (据我所知,在会话中存储对象是轨道中的BAD练习)
2)我可以移动所有用于从各种submitting_controller / submitting_action中提取非post创建表单数据的逻辑,将它放在ApplicationController中,在PostsController中创建一个巨大的switch语句:: create for submitting_controller / submitting_action并调用ApplicationController中的方法可以获取每个提交页面渲染所需的所有额外数据。
关于在Rails中执行此操作的最佳方法的想法?
答案 0 :(得分:1)
这是关于通过使用AJAX从完整页面更新移动到更新页面部分的要点。您应该考虑很多事情,但最常用的方法是在AJAX响应和纯HTML响应之间拆分响应。查看this ONLamp article,this register article或the awesome agile web development with rails book。基本上你的控制器渲染一个新的div替换旧的div,其中包含提交部分的结果。
在你的问题中你提到了两种方法,所以我会尝试给你一些关于为什么以及为什么不在这里的指示:
选项1)通过几次调整,选项并不是那么糟糕。主要的调整是将对象以序列化形式存储在DB中。然后简单地传递序列化对象的ID。你的好处是会话数据持续存在,因此恢复会话更整洁,你的会话保持清晰。这样做的缺点是,在您的数据库中有一桶会话会污染您的应用程序,您需要考虑如何使数据库中未使用的会话失效。我从来没有见过这样的结局......
Option2)Eeek不在application_controller中! :)说真的,把它作为你最后的武器。您可以在帮助程序中弹出内容,并在控制器和视图中访问这些方法。然而,对那些东西的测试并不那么容易,所以在选择那条路线之前要小心。切换语句可以在OO应用程序中进行一些思考,当然在他的情况下,你可以使用选项哈希来获得一些关于在提出请求时对应用程序状态有一些了解的方法。
答案 1 :(得分:1)
你的Post模型是否属于belongs_to关系,每个模型的控制器你将使用它来渲染你的表单?您是否在Post.create(params[:post])
以后的Post控制器中进行任何特殊处理?
如果您对第一个问题的回答是肯定而对第二个问题的回答是否定的,则可以通过向用户可以创建帖子的每个控制器添加accepts_nested_attributes_for来进行最少的修改。
无论如何,Robertpostill是正确的,因为这可能是什么时候开始查看AJAX,只是替换页面的部分。唯一的问题是如果用户禁用了javascript,该怎么办。我个人喜欢为非javascript案例设计并添加方便的方法。
关于你认为你的两个选择的想法,
1)我使用此方法在flash哈希中存储对象的浅表副本。跨重定向保留它。但是考虑到帖子的可变性,这可能对你不起作用。因为你只能发送大约4K的数据,除了你的浅拷贝之外还包括其他信息。
2)参见robertpostill的回复