【问题标题】:How to refer back to associated index with link_to如何使用 link_to 引用关联索引
【发布时间】:2019-07-28 16:02:03
【问题描述】:

第一次做嵌套路由,我无法找出我拥有的嵌套路由的 link_to 路径。为每个使用 rails 脚手架

resources :venues do
     resources :events
   end

我在场地模型的 index.html.erb 中编辑了以下内容

<%= link_to 'Events', venue_events_path(venue) %>

这让我找到了事件模型的正确 index.html.erb (venues/1/events)

但我似乎无法在活动的显示页面上找出正确的 link_to 路径,以将我带回场所/1/活动

使用默认脚手架,其 <%= link_to 'Back', events_path %>

我尝试了不同的路径,例如场地_events_path(venue),但 rails 一直说它找不到没有 ID 的场地。 我假设这是因为单击默认显示链接会将我带到 localhost:3000/events/1 而不是 localhost:3000/venues/1/events/1

除了我面临的困难之外,嵌套属性的正确路径是什么?

【问题讨论】:

    标签: ruby-on-rails associations link-to


    【解决方案1】:

    对于嵌套路由,我将使用以下设置:

    # routes.rb
    resources :venues do
      resources :events
    end
    
    # venues controller
    class VenuesController < ApplicationController
      def index
        @venues = Venue.all
      end
    
      def show
        @venue = Venue.find(params[:id])
      end
    end
    
    # venues index.html.erb
    <% @venues.each do |venue| %>
      <%= link_to 'Venue', venue_path(venue) %>
    <% end %>
    
    # venues show.html.erb
    # link to the events index page from the current venue
    <%= link_to 'Events', venue_events_path(@venue) %>
    
    # link to each individual event from the current venue
    <% @venue.events.each do |event| %>
      <%= link_to 'Event', venue_event_path(@venue, event)
    <% end %>
    
    # events controller
    class EventsController < ApplicationController
      def index
        @venue = Venue.find(params[:venue_id])
        @events = @venue.events
      end
    
      def show
        @event = Event.find(params[:id])
      end
    end
    
    # events index.html.erb
    # link back to venue
    <%= link_to 'Venue', venue_path(@venue) %>
    
    # link to each event
    <% @events.each do |event| %>
      <%= link_to 'Event', venue_event_path(event.venue, event) %>
    <% end %>
    
    # events show.html.erb
    # link back to events index
    <%= link_to 'Events', venue_events_path(@event.venue) %>
    
    # link back to venue show
    <%= link_to 'Venue', venue_path(@event.venue) %>
    

    请记住,这只有在您的活动有场地 ID 时才有效。您说您的活动模型中有:belongs_to :venue, optional: true 可选的 true 使活动不需要场所 ID。如果这是您想要的,那么嵌套路由就没有意义了,因为 NOT 嵌套事件不会被嵌套链接。

    【讨论】:

    • 您的 routes.rb 中是否还有一行 resources :events(未嵌套)?
    • 不,我没有。我只是无法找出往返页面的正确路径
    • 实际上,venue_events_path(@event.venue) 似乎不起作用。它仍然说没有路线匹配并且我的venue_id 为零,缺少必需的键:[:venue_id] 我确实有belongs_to :venue, optional: truedef index @venue = Venue.find(params[:venue_id]) @events = @venue.events.all end
    • 您好,感谢您的精彩回答!但我确实对脚手架 respond_to do |format| if @question.save format.html { redirect_to @question, notice: 'Question was successfully created.' } format.json { render :show, status: :created, location: @question } else format.html { render :new } format.json { render json: @question.errors, status: :unprocessable_entity } end end end 有问题,因为这是一个嵌套属性,我应该用 @question 替换什么?
    • 您需要为此提供更多信息。比如什么是父母?你想让它做什么?它应该呈现什么以及它应该重定向到哪里
    猜你喜欢
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多