我有一种情况,我将其他字段传递给form_for函数,该函数不属于模型。这些字段是:redirect_to,redirect_time。在成功提交表单后,我使用这些字段知道重定向用户的位置 - 我不存储它们,只需在控制器中读取。
现在,当我拥有时,一切都很完美:
<%= form_for @mymodel .. %>
<%= if defined?(redirect_to) %>
<%= hidden_field_tag :redirect_to, redirect_to %>
<% end %>
<% end %>
读入控制器:
def action
if params['redirect_to']
redirect_to params['redirect_to']
end
end
但是当表单出错时会出现问题,当然Rails不会传递那些不属于当前资源的参数。
在表单提交失败时,在Rails中处理这种情况的最优雅的方法是保留这些字段吗?
感谢您的帮助
答案 0 :(得分:4)
我认为你最好将这些变量存储在session
而不是表格中。首先,如果人们开始在你的网页源头开始讨论,它会让他们更难干涉;其次,一旦你完成处理提交的表格,它们就可以用于你需要的任何动作或控制器。
由于它们与表单本身无关,因此在它之外将它们抽象得更清晰。
在呈现表单之前,只需在控制器中设置所需的会话变量:
session[:redirect_to] = url_to_redirect_to_after_submitting_form
然后,您可以在创建操作中保存记录后重定向:
def create
# ... save record
redirect_to session[:redirect_to]
end
答案 1 :(得分:2)
通过ActiveRecord传递非模型字段是解决路由问题的不良解决方案。
遵守约定并使用ActiveRecord作为应用程序数据状态的接口。