【问题标题】:ActionView::Template::Error (No route matches {:action=>"destroy", :id=>nil}, unmatched constraints: [:id]):ActionView::Template::Error(没有路由匹配 {:action=>"destroy", :id=>nil},不匹配的约束:[:id]):
【发布时间】:2019-10-03 04:43:37
【问题描述】:

我在我的活动展示页面中添加了“兴趣”按钮,该页面有两个视图:显示为 1) 如果用户在兴趣列表中没有该事件,则为“兴趣” 2) 如果用户已将事件添加到兴趣列表,则“删除兴趣”

但是,添加到兴趣列表的活动显示页面出现错误。 “删除兴趣”按钮/链接会导致以下错误。

这是错误信息

ActionView::Template::Error (没有路由匹配 {:action=>"destroy", :controller=>"interests", :id=>nil},可能的不匹配约束: [:id]):

从我的检查来看,这可能是因为兴趣的 ID 没有传递到 interest_path,虽然我已经有了它......

观点

    <div class="int-btn">
      <% if user_signed_in? && current_user.interested_events.include?(@event) %>
        <%= link_to interest_path(@interest), method: :delete, data: { confirm: "You have removed this event from your interest list" } do %>
          <div class = "btn btn-main m-2">Remove Interest</div>
        <% end %>
      <% else %>
        <%= link_to event_interests_path(@event), method: :post, data: { confirm: "You have add this event in your interest list" } do %>
          <div class = "btn btn-main m-2">Interested</div>
        <% end %>
      <% end %>
    </div>

架构

  create_table "interests", force: :cascade do |t|
    t.bigint "user_id"
    t.bigint "event_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["event_id"], name: "index_interests_on_event_id"
    t.index ["user_id"], name: "index_interests_on_user_id"
  end

路线

Rails.application.routes.draw do
  devise_for :users, controllers: { registrations: 'users/registrations' }
  root to: 'pages#home'

  resources :events do
    resources :interests, only:[:create]
    resources :reviews, only:[:create]
  end

  resources :plans, except:[:destroy] do
    resources :event_plans, only:[:create]
  end

  resources :reviews, only:[:destroy]
  resources :interests, only:[:destroy]

  get 'events/tagged', to: "events#tagged", as: :tagged
end

控制器

class InterestsController < ApplicationController
  def create
    @event = Event.find(params[:event_id])
    @interest = Interest.new(interest_params)
    @interest.user = current_user
    @interest.event = @event
    authorize @interest
    if @interest.save
      redirect_to event_path(@event)
    else
      render 'events/show', event: @event
    end
  end

  def destroy
    @interest = Interest.find(params[:id])
    authorize @interest
    # @event.user = current_user
    @event = @interest.event
    @interest.destroy
    redirect_to event_path(@event)
  end

  private

  def interest_params
    params.require(:interest).permit(:user_id, :event_id)
  end
end

型号

class Interest < ApplicationRecord
  belongs_to :user
  belongs_to :event
end

如果您有任何其他问题或需要更多信息,请告诉我。

感谢您的所有帮助!

【问题讨论】:

  • 您是否应该在您的资源中为events:interests 执行销毁操作?
  • 你应该尝试@interest.id 而不是传递整个对象
  • @interest 是什么?
  • 所以,这就是@gn2463 的问题。 @interest 不能为 nil,它必须是一个 Interest 对象。
  • 那么这意味着您的@interest 没有正确启动,您应该修复它。不要以 new 启动它必须是数据库持久对象。

标签: ruby-on-rails ruby ruby-on-rails-5


【解决方案1】:

错误消息是说@interest 的id 为nil。您可能没有在事件控制器显示操作中正确设置 @interest 变量。应该是这样的:

class EventsController < ApplicationController
  def show
    # other code here
    @event = Event.find(params[:id])
    @interest = Interest.find_by(user: current_user, event: @event)
  end
end

如果这个页面也可以被未登录的用户访问,它会给你一个关于当前用户的错误,为了快速解决你可以将它调整为:

class EventsController < ApplicationController
  def show
    # other code here
    @event = Event.find(params[:id])
    if user_signed_in?
      @interest = Interest.find_by(user: current_user, event: @event)
    end
  end
end

【讨论】:

  • 你是对的。正如你提到的,我没有在事件控制器中设置@.interest。现在它起作用了!非常感谢!
猜你喜欢
  • 2019-12-16
  • 2017-02-13
  • 1970-01-01
  • 2012-07-17
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 2014-11-26
相关资源
最近更新 更多