我有一个名为 的模型Person
,我想要一个名为 的资源Employee
。我发现这会停止form_for
魔法。
我需要传入@person
对象本身,以便 form_for 可以选择正确的操作路径(创建或更新)。
但是,这意味着 form_for 在输出中使用POST people_path
andPUT person_path
而不是employee_path
s。
当我的模型和控制器有不同的名称时,是否有可能拥有所有 Rails 约定的好东西?
我有一个名为 的模型Person
,我想要一个名为 的资源Employee
。我发现这会停止form_for
魔法。
我需要传入@person
对象本身,以便 form_for 可以选择正确的操作路径(创建或更新)。
但是,这意味着 form_for 在输出中使用POST people_path
andPUT person_path
而不是employee_path
s。
当我的模型和控制器有不同的名称时,是否有可能拥有所有 Rails 约定的好东西?
如果您想在路由/url 中使用“员工”,您可以在路由中使用“路径”,例如。将控制器创建为 people_controller 但在路由中
resources :people, path: "employees"
所以路线会像
new_person GET /employees/new
people GET /employees
ETC
所以以下将起作用
<%= form_for @people do |f| %>
...
<% end %>
注意:为此,您必须使用 Person 模型
您可以添加一个选项: url: employee_path
例如
<%= form_for @people, :as => :post, :url => employee_path(@people) do |f| %>
...
<% end %>
所以我有一个我已经构建的自定义 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
我测试了它,效果很好。如果有人对这种方法有任何批评,无论如何-我很想听听。
我的环境: