Rails中link_to传多参数报错:No route matches [GET]
问题解决步骤
1. 修正路由辅助方法误用
你遇到的No route matches [GET] "/events/7/event_guests.4"错误,核心原因是取消报名的链接误用了复数路由辅助方法。从你提供的路由列表可以看到,DELETE动作对应的路由前缀是单数的event_event_guest,而非复数的event_event_guests——复数路径仅对应创建(POST)动作,不需要id参数,因此你传递@event_guest时,Rails会把它的id误识别为URL格式后缀,导致路径无效。
修改user/show.html.erb中的取消报名链接:
<% if user_signed_in? && !@event_guest.nil? %> <%= link_to "Not attend", event_event_guest_path(@event, @event_guest), data: { turbo_method: :delete, turbo_confirm: "确定要取消报名吗?" } %> <% end %>
2. 修复Controller拼写错误
EventGuestsController的destroy方法里存在拼写错误:EventGuest.exist?应改为EventGuest.exists?(多一个s),否则会触发方法不存在的错误:
def destroy if EventGuest.exists?(params[:id]) @event_guest = EventGuest.find(params[:id]) @event_guest.destroy end redirect_to root_path, status: :see_other end
同时将redirect_to root改为redirect_to root_path,更符合Rails规范。
3. 可选优化:简化EventsController的show方法
原show方法的判断逻辑可以用find_by简化,代码更简洁:
def show @event = Event.find(params[:id]) @event_guest = EventGuest.find_by(attended_event_id: @event.id, attendee_id: current_user.id) if user_signed_in? end
用户未登录时@event_guest自动为nil,无需额外判断。
内容的提问来源于stack exchange,提问作者Thảo Nguyễn
相关产品推荐
相关产品推荐

