Proz1g
Proz1g

Reputation: 1227

Rails - Nested Forms - Get a attribute from another model

I'm new to Rails so maybe this is a stupid question. I'm struggling to get a attribute from another model in a nested form. Let me explain:

I have 3 models linked each other. Poi -> PoiDescription <- DescriptionType One Poi can have multiple descriptions and a description have only one description type. I'm creating the PoiDescriptions inside the Poi form with a nested form. Every thing is working well, but now, inside the fields_for I want a label before the textarea with the name of the description type. But I don't know how to get it...I can't do something like 'p.description_type.name' so how can I get that attribute?

Here is my code:

Poi Controller

def new
  @poi = Poi.new
  @descriptions = DescriptionType.all
  @descriptions.each do |d|
   @poi.poi_descriptions.new(description_type_id: d.id)
  end
end

Poi form

<%= form_with model: @poi do |f| %>
...
  <div class="col-md-12">
     <%= f.fields_for :poi_descriptions do |p| %>
       <%= p.hidden_field :description_type_id %>
       <%= p.text_area :description %>
     <% end %>
  </div>
...

Schema

create_table "description_types", force: :cascade do |t|
  t.string "name"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

create_table "poi_descriptions", force: :cascade do |t|
  t.text "description"
  t.bigint "poi_id"
  t.bigint "description_type_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.index ["description_type_id"], name: "index_poi_descriptions_on_description_type_id"
  t.index ["poi_id"], name: "index_poi_descriptions_on_poi_id"
end

create_table "pois", id: :serial, force: :cascade do |t|
  t.text "name"
  t.float "longitude"
  t.float "latitude"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.integer "monument_id"
  t.integer "beacon_id"
  t.string "image_file_name"
  t.string "image_content_type"
  t.integer "image_file_size"
  t.datetime "image_updated_at"
  t.index ["beacon_id"], name: "index_pois_on_beacon_id"
  t.index ["monument_id"], name: "index_pois_on_monument_id"
end

Hope you can help me! Thanks in advance.

Upvotes: 0

Views: 86

Answers (1)

Tashows
Tashows

Reputation: 559

To get from the form_builder_object to the actual object you can do p.object.description_type.name

If you just want that as a title and not as an input field you can either:

  1. Add it in a p or span tag and make it look like a label with css or
  2. Add a label_tag with a custom name and title as you need. https://apidock.com/rails/ActionView/Helpers/FormTagHelper/label_tag

Upvotes: 2

Related Questions