Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Active Relations: undefined method `city'

I am using Rails 4.2.4. I know I have set my relations correctly but I'm getting undefined method "city" for #

support.rb:

belongs_to :user

user.rb:

has_many :supports (should the be plural?)

views/users/show.html.erb:

<%= @user.supports.city %>

In my supports table:

t.string :city
t.integer :user_id

I have a form for support in which I have filled out the city field and I can see in entry with Support.all in the rails console so Im sure the value for :city is saved in the db.

I have used rails g scaffold support for this process where a user can create many supports. Am I missed something?

like image 804
Sylar Avatar asked Mar 06 '26 00:03

Sylar


2 Answers

  1. has_many :supports should be plural
  2. @user.supports returns all supports but it can return an empty array. So you have to use:

if support = @user.supports.first # use support.city end

or

<% @user.supports.each do |support| %>
   <h1><%= support.city %></h1>
<% end %>
like image 168
Arsen Avatar answered Mar 07 '26 14:03

Arsen


If you're trying to access associative data, you'll need to understand that pluralized relations (IE has_many) will return collections of data:

#app/models/support.rb
class Support < ActiveRecord::Base
   belongs_to :user #-> @support.user
end

#app/models/user.rb
class User < ActiveRecord::Base
   has_many :supports #-> @user.supports
end

To answer your question about the :plural, no, you don't need to call it a plural. However, as per Rails convention, it builds the entire relationship (and queries) off the back of the name:

belongs_to associations must use the singular term. If you used the pluralized form in the above example for the customer association in the Order model, you would be told that there was an "uninitialized constant Order::Customers". This is because Rails automatically infers the class name from the association name. If the association name is wrongly pluralized, then the inferred class will be wrongly pluralized too.

If you wanted to use singular names for your associations with has_many, you'll have to define your class etc:

#app/models/user.rb
class User < ActiveRecord::Base
   has_many :support, class_name: "Support", foreign_key: "support_id"
end

--

When you get your returned data from a has_many collection, you need to cycle through the data. Since it's a collection (as opposed to a "member" -- single record), you will need to something like the following:

<% @user.supports.each do |support| %>
   <%= support.city %>
<% end %>
like image 41
Richard Peck Avatar answered Mar 07 '26 13:03

Richard Peck



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!