首页 > 解决方案 > 版本控制控制器路径中的 Rails NoMethodError

问题描述

在仅使用 Rails::API 工作 2 年后,我试图通过构建 Rails monolit 应用程序来更新我的知识。我使用 Rails 脚手架来构建Property( rails generate scaffold property),它最后给了我模型、控制器和视图。现在我正在尝试使用版本控制来拥有控制器结构:api/v1/properties_controller. 对于这个例子,假设我只想有Index动作,路由如下:

Rails.application.routes.draw do
  namespace :api do
    namespace :v1 do
      resources :properties, only: [:index]
    end
  end
end

和 rake 路线向我展示了预期的结果:

                           Prefix Verb   URI Pattern                                                                              Controller#Action
                api_v1_properties GET    /api/v1/properties(.:format)                                                             api/v1/properties#index

但是当我试图找到路径时,我得到了一个错误:

Api::V1::PropertiesController#index is missing a template for request formats: text/html

这意味着我在里面没有意见views/api/v1/property。当我将所有脚手架视图移至 时app/views/propertiesapp/views/api/v1/properties出现错误:

NoMethodError in Api::V1::Properties#index
undefined method `property_path' for #<#<Class:0x00007fc4b6656f08>:0x00007fc4b66540a0>
Extracted source (around line #23):
(...)
23        <td><%= link_to 'Show', property %></td>

有什么快速的方法可以将这些路径转移到正确的路径中,或者我应该错过什么吗?

index.html.erb

  <tbody>
    <% @properties.each do |property| %>
      <tr>
        <td><%= property.name %></td>
        <td><%= property.status %></td>
        <td><%= property.name_tag %></td>
        <td><%= property.portfolio_id %></td>
        <td><%= link_to 'Show', property %></td>
        <td><%= link_to 'Edit', edit_property_path(property) %></td>
        <td><%= link_to 'Destroy', property, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>

标签: ruby-on-railsruby

解决方案


中有Show, Edit,Destroy链接index.html.erb。所以你需要定义它们routes.rb

namespace :api do
  namespace :v1 do
    resources :properties, only: [:index, :show, :edit, :delete]
  end
end

添加您需要将命名空间添加api_vi到路径中index.html.erb

<td><%= link_to 'Show', api_v1_property_path(property) %></td>
<td><%= link_to 'Edit', api_v1_edit_property_path(property) %></td>
<td><%= link_to 'Destroy', api_v1_property_path(property), method: :delete, data: { confirm: 'Are you sure?' } %></td>

推荐阅读