【问题标题】:Form_for with model name different to controller模型名称与控制器不同的 Form_for
【发布时间】:2013-03-24 14:10:22
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是否在多种情况下使用您的人员模型?我的意思是,您还有其他基于此模型的资源吗?顺便说一句,“人物”对于模特来说是一个糟糕的名字——模特的名字应该是单数。
  • 是的,它在多个上下文中使用。而我的错误,Person 应该是模型的正确名称

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


【解决方案1】:

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

例如

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

【讨论】:

  • 是的,但这意味着我也必须手动处理“更新”案例。我正在寻找一种方法来避免这种情况。
  • 我不是 OP,但我更喜欢你的解决方案。这怎么能用于new 操作?我目前正在尝试使用form_for @people, url: employee_path, html: {method: :post} do |f|,但我收到一个错误,提示我缺少 id,但它会将我发送到 show 操作而不是 create。
  • @user3209270, url: employees_path 用于创建
  • 是的,抱歉,我的意思是说employees_path。我正在使用不同的模型,但与 OP 非常相似,在我的情况下,news 相当于 employees,而 article 相当于 person。我正在使用form_for @article, url: news_path, html: {method: :post} do |f|,我得到的完整错误是No route matches {:action=&gt;"show", :controller=&gt;"news"} missing required keys: [:id]
  • 我想我搞砸了。我做了另一个控制器(以避免newnews 混淆),它似乎工作。
【解决方案2】:

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

resources :people, path: "employees"

所以路线会像

new_person GET    /employees/new
people GET    /employees

所以下面会起作用

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    def new
      @path = employees_path
    end
    
    def edit
      @path = employee_path
    end
    

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

    我的环境:

    • Rails 5.2.0
    • 设计 4.4.3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 2015-06-20
      相关资源
      最近更新 更多