Rails在多个页面上具有相同表单的最佳实践

emp*_*e29 6 ruby forms ruby-on-rails actioncontroller

我正在开发一个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对象拉出会话并使用它来重新填充表单/错误消息.(据我所知,在会话中存储对象是在rails中的BAD练习)

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

关于在Rails中做到这一点的最佳方法的想法?

EmF*_*mFi 1

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

如果您对第一个问题的回答是“是”,对第二个问题的回答是“否”,则可以通过将accepts_nested_attributes_for添加到用户可以在其上创建帖子的每个控制器来以最少的修改来完成。

不管怎样,Robertpostill 是正确的,因为这可能是开始考虑 AJAX 的时候,只是为了替换页面的部分。唯一的问题是如果用户禁用了 javascript 该怎么办。就我个人而言,我喜欢为非 javascript 情况进行设计并添加便捷的方法。

至于你对两种选择的看法,

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

2)参见 Robertpostill 的回复