【问题标题】:Rails has_one new action going to wrong routeRails has_one 新动作走错路线
【发布时间】:2012-06-16 00:02:27
【问题描述】:

当我单击“项目”显示页面上的“新计划状态”按钮时,错误显示的路线是复数,而它应该是单数。这是我的代码:

# project.rb
class Project < ActiveRecord::Base
  has_one :schedule_status
end

# schedule_status.rb
class ScheduleStatus < ActiveRecord::Base
  belongs_to :project
end

# schedule_statuses_controller.rb
def new
  @project = Project.find(params[:project_id])
  @schedule_status = @project.build_schedule_status
end

# routes.rb
resources :projects do
  resource :schedule_status
end

# _form.html.erb
<%= form_for [@project, @schedule_status] do |f| %>
  ...

错误告诉我我的form_for 行不正确。看来我的实例变量设置正确,但错误是:

undefined method `project_schedule_statuses_path` for ...

知道为什么它尝试访问的路线是复数吗?

【问题讨论】:

    标签: ruby-on-rails routes associations has-one


    【解决方案1】:

    这是一个错误。 form_for 查找对象的复数形式。但是,由于您声明了一个单一资源 :schedule_status,因此永远不会创建路径辅助方法。

    要解决这个问题,您应该为 form_for 使用 :url 参数。

    请查看此question/answer 以获得更清晰的信息。

    【讨论】:

    • 哇,非常感谢。我一直在寻找这个,但不知何故我错过了。
    【解决方案2】:

    这不是一个错误,它是一个功能(票证已关闭,因为无法修复):

    导轨问题:

    https://github.com/rails/rails/issues/1769

    摘要引用:

    这个错误已经存在了很长时间,但是一个干净的解决方案 不容易代表自己。 polymorphic_url 助手没有 运作方式的“智能”——它没有关于什么的信息 您已在您的 routes.rb 中声明为资源。所有它必须继续下去 模型的名称以及它如何映射到命名的 url 助手。

    问题是没有简单的方法来辨别模型是否映射 到单个或常规资源 url。检查是否存在 集合 url 不起作用,因为可能已指定资源 使用 :except => :index 并尝试挽救路由生成错误 不起作用,因为将实例传递给单个资源 url helper 将生成一个格式设置为 id 的 url,并且没有 例外。

    rails 问题有利于以前的问题: https://github.com/rails/rails/issues/4978

    结论

    在这种情况下,您应该提供网址。 url_for 不能反映 在路线上查看这是否是资源。

    【讨论】:

    • 我不会称其为功能,而更像是“不确定如何实现此功能”
    • 顺便说一句,我提出了一个解决方案,看问题
    猜你喜欢
    • 2011-10-02
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    相关资源
    最近更新 更多