Form_for,型号名称与控制器不同

时间:2013-04-03 03:32:47

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

我有一个名为Person的模型,我希望有一个名为Employee的资源。我发现这会阻止form_for魔法。

我需要传递@person对象本身,因此form_for可以选择正确的操作路径(创建或更新)。

但是,这意味着form_for在输出中使用POST people_pathPUT person_path,而不是employee_path s。

当我的模型和控制器有不同的名称时,是否可以拥有所有Rails约定好东西?

3 个答案:

答案 0 :(得分:10)

如果您想在路线/网址中使用“employees”,您可以在路线中使用“路径” 例如。 创建控制器作为people_controller但在路由中

resources :people, path: "employees"

所以路线就像

new_person GET    /employees/new
people GET    /employees

以下是可行的

<%= form_for @people do |f| %>
  ...
<% end %>

注意:为此你必须使用人物模型

答案 1 :(得分:5)

您可以添加一个选项:url:employee_path

e.g。

<%= form_for @people, :as => :post, :url => employee_path(@people) do |f| %>
  ...
<% end %>

答案 2 :(得分:0)

所以我有一个自定义C.R.M.我已经构建的代码,它使用employee_controller来传递和检索来自Devise的用户模型的值。我不希望可以访问Devise视图,但是我想使用Devise进行用户身份验证,因为...让我们面对现实,他们发现这很好。

事实证明,我在同一问题上遇到了麻烦,我在表单中嵌入了Ruby标签:

<%= form_for @employee, as: :user, url: employees_path do |f| %>

这里的问题应该很明显(尽管花了我一个多小时才找到)-如果我正在执行“新”操作,它将很好用。它将采用表格数据,将其传递到新的User.new对象中,并为我创建一个新用户。但是,如果我尝试编辑我的员工的信息,例如通过更新其密码或在其说明中添加更多内容,它将失败-表示没有“ [PATCH]方法作为路径/员工”。

我想有点hacky,但是我的解决方案只是在“ new”和“ edit”操作中放置一个@path实例变量:

def new
  @path = employees_path
end

def edit
  @path = employee_path
end

我测试了它,效果很好。如果有人对此方法有任何批评,我一定很乐意听到。

我的环境:

  • 导轨5.2.0
  • Devise 4.4.3