0

更新 - 我现在已经解决了这个问题- 我为每个课程项目创建了一个部分,并从主列表视图中呈现它们。感谢您的所有帮助,我不太确定它为什么会起作用,但它确实END OF UPDATE

抱歉,如果这看起来像是重复发帖,但我已经尝试将解决方案应用于类似问题,但它们没有奏效,我被困住了!欢迎任何建议,谢谢。

问题 我有一个属于“列表”模型的“课程”模型。课程在属于列表的页面上创建和删除,即“/listing/2/courses”

错误信息

No route matches [DELETE] "/listings/2/courses" 

课程控制器 def 销毁细节

class CoursesController < ApplicationController

  before_action :authenticate_user!, except: [:show]
  before_action :set_listing
  before_action :set_course, except: [:index, :new, :create]

  def destroy
    @course = @listing.courses.find(params[:id])
    @course.destroy
    flash[:notice] = "Course deleted!"
    redirect_back(fallback_location: request.referer)
  end

  private

  def set_course
    @listing = Listing.find(params[:listing_id])
    @course = Course.find(params[:id])
  end

  def set_listing
    @listing = Listing.find(params[:listing_id])
  end

  def course_params
    params.require(:course).permit(:name, :curriculum_type, :summary, :address, :course_places, :start_date, :finish_date, :price)
  end

end

列表/列表ID/课程页面详细信息

<%= @listing.courses.each do |f| %>
  <div class="jumbotron">
    <ul>
    <li>Name = <%= f.name %></li>
    <li>Type of course = <%= f.curriculum_type %></li>
    <li>Number of places = <%= f.course_places %></li>
    <li>Start Date = <%= f.start_date %></li>
    <li>Finish Date = <%= f.finish_date %></li>
    <li>Price (£) = <%= f.price %></li>
    <%= link_to "Delete Course", listing_courses_path(@listing, @course), method: :delete %>
    </ul>
  </div>
<% end %>

Routes.rb 详细信息

resources :users, only: [:show]
  resources :listings, except: [:edit] do
    member do
      get 'listing'
      get 'pricing'
      get 'description'
      get 'photo_upload'
      get 'amenities'
      get 'location'
      get 'courses'
    end
        resources :courses, except: [:edit] do
          member do
            get 'listing'
            get 'pricing'
            get 'description'
            get 'photo_upload'
            get 'amenities'
            get 'location'
        end
    end
  end
4

3 回答 3

1
<%= link_to listing_course_path(@listing,f), :method => :delete, :data => { :confirm => 'Are you sure?' } %>

或尝试

  <%= link_to listing_course_path(@listing,id: f.try(:id)), :method => :delete, :data => { :confirm => 'Are you sure?' } %>

路由.rb

 resources :listings do
      resources :courses
 end
于 2017-10-25T13:15:15.967 回答
0

默认情况下,destroy方法需要一个 ID,因为它是成员路由。您正在使用listing/listingID/courses没有 ID 的路线。为此,您需要定义listing和/或courses作为单一资源(阅读此内容),例如:

resource :courses do
:
end

如this answerdestroy中所述或制作collection如下路线:

resources :courses, except: [:edit] do
  delete :destroy, on: :collection
  :
  rest...
end

试试看这是否有效。

顺便说一句,这看起来有点多余,因为您正在迭代每个@listing.courses并调用courses#destroy您正在销毁所有的courses地方@listing。那么,为什么@listing.courses.each首先要做。您应该使用一种listing#destroy_courses方法或删除@listing.courses.each迭代。

于 2017-10-25T12:52:00.587 回答
0

将 link_to 中的路径从 Listing_courses_path(@listing, @course) 更新到 Listing_course_path(@listing, @course)

<%= link_to "Delete Course", listing_course_path(@listing, f), method: :delete %>
于 2017-10-25T13:20:27.967 回答