【问题标题】:Rails NoMethodError in versioning controller path版本控制控制器路径中的 Rails NoMethodError
【发布时间】:2021-05-27 05:40:48
【问题描述】:

在仅使用 Rails::API 工作 2 年后,我正在尝试通过构建 Rails 单体应用来更新我的知识。我使用 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 routes 向我显示了预期的结果:

                           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/properties 移动到 app/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-rails ruby


    【解决方案1】:

    index.html.erb 中有 ShowEditDestroy 链接。所以你需要在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>
    

    【讨论】:

    • 好的,但是如何与路径 app/views/properties 而不是 app/views/api/v1/properties 内的视图配对?我认为路径api/v1/... 不是一个好习惯。
    猜你喜欢
    • 1970-01-01
    • 2012-03-26
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多