Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Rails – Dynamic query all records from has_many association with link_to

I have a model Building that has many residents. My index page list all buildings with a link to list all residents from that building. I’m learning ROR again, and I’m struggling to create this view.

Here is what I got so far.

../models/building.rb

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

class Building < ApplicationRecord
  has_many :residents
end

../models/resident.rb

class Resident < ApplicationRecord
  belongs_to :building
end

..controllers/buildings_controller.rb

Here is where I start to get lost. In my show action I don’t know how to pass the params to generate a view with all residents from a building using link_to. I’m not sure how I can do it.
Or how to do a query like r = Resident.all.where(:building_id => 1), but dynamically.

class BuildingsController < ApplicationController

def index
  @building = Building.all
end

def show
  @building = Building.find(params[:id])
  @buildings = Building.all
end

..views/buildings/index.rb

  <% @building.each do |b| %>
    <div>
      <%= link_to b.name, '/buildings/show/'b.id %>
    </div>
  <% end %>

I’m open to different approaches…

Thank you community!

>Solution :

You should take a look at the named routes feature in Ruby on Rails: https://guides.rubyonrails.org/routing.html#path-and-url-helpers

Creating a resourceful route will also expose a number of helpers to the controllers in your application. In the case of resources :photos:
photos_path returns /photos

new_photo_path returns /photos/new
edit_photo_path(:id) returns /photos/:id/edit (for instance, edit_photo_path(10) returns /photos/10/edit)
photo_path(:id) returns /photos/:id (for instance, photo_path(10) returns /photos/10)

Each of these helpers has a corresponding _url helper (such as photos_url) which returns the same path prefixed with the current host, port, and path prefix.

So to be able to reach your controller, you have to add some routes to your routes.rb file and use it in your view:

# routes.rb
  resources :buildings
  resources :residents


# index view
  <% @building.each do |b| %>
    <div>
      <%= link_to b.name, building_path(b) %>
    </div>
  <% end %>

# show view to show all residents, belonging to a building
  <% @building.residents.each do |resident| %>
    <div>
      <%= link_to resident.name, resident_path(resident) %>
    </div>
  <% end %>
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading