我有一个名为Person
的模型,我希望有一个名为Employee
的资源。我发现这会阻止form_for
魔法。
我需要传递@person
对象本身,因此form_for可以选择正确的操作路径(创建或更新)。
但是,这意味着form_for在输出中使用POST people_path
和PUT person_path
,而不是employee_path
s。
当我的模型和控制器有不同的名称时,是否可以拥有所有Rails约定好东西?
答案 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
我测试了它,效果很好。如果有人对此方法有任何批评,我一定很乐意听到。
我的环境: