使用ActiveRecord传递非模型字段

时间:2014-02-20 11:52:33

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我有一种情况,我将其他字段传递给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中处理这种情况的最优雅的方法是保留这些字段吗?

感谢您的帮助

2 个答案:

答案 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作为应用程序数据状态的接口。