4

我有一个名为 的模型Person,我想要一个名为 的资源Employee。我发现这会停止form_for魔法。

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

但是,这意味着 form_for 在输出中使用POST people_pathandPUT person_path而不是employee_paths。

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

4

3 回答 3

11

如果您想在路由/url 中使用“员工”,您可以在路由中使用“路径”,例如。将控制器创建为 people_controller 但在路由中

resources :people, path: "employees"

所以路线会像

new_person GET    /employees/new
people GET    /employees

ETC

所以以下将起作用

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

注意:为此,您必须使用 Person 模型

于 2013-04-03T10:44:57.200 回答
6

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

例如

<%= form_for @people, :as => :post, :url => employee_path(@people) do |f| %>
  ...
<% end %>
于 2013-04-03T03:53:37.517 回答
1

所以我有一个我已经构建的自定义 CRM,它使用 employees_controller 从 Devise 的用户模型中传递和检索值。我不希望 Devise 视图可以访问,但我想使用 Devise 进行用户身份验证,因为......让我们面对现实吧,他们已经很好地解决了这个问题。

好吧,事实证明,我在同样的问题上遇到了一些麻烦,我为表单嵌入了一个 Ruby 标签:

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

这里的问题应该很明显(尽管我花了一个小时才找到)——如果我正在进行“新”操作,它会很好用。它将获取表单数据,将其传递给新的 User.new 对象,然后为我创建一个新用户。但是,如果我试图编辑我的员工的信息,比如通过更新他们的密码或在他们的描述中添加更多信息,它将失败 - 说没有“路径 /employees 的 [PATCH] 方法”,这是真的.

我想有点 hacky,但我的解决方案只是将 @path 实例变量放在“新建”和“编辑”操作中:

def new
  @path = employees_path
end

def edit
  @path = employee_path
end

我测试了它,效果很好。如果有人对这种方法有任何批评,无论如何-我很想听听。

我的环境:

  • 导轨 5.2.0
  • 设计 4.4.3
于 2018-08-07T07:07:37.900 回答