Corey Quillen
Corey Quillen

Reputation: 1576

Set fields in a controller

When creating a new Person, how do I set its fields that are not included in the new.html.erb form?

Here is the controller and form:

class PeopleController < ApplicationController

    def new
        @account = Account.find_by_id(params[:account_id])
        organization = @account.organizations.primary.first
        location = organization.locations.primary.first
        @person = location.persons.build    
    end

    def create
        @person = Person.new(params[:person])
        if @person.save
            flash[:success] = "Person added successfully"
            redirect_to account_path(params[:account_id])
        else
            render 'new'
        end
    end
end


<h2>Account: <%= @account.organizations.primary.first.name %></h2>

<%= form_for @person do |f| %>

    <%= f.label :first_name %><br />
    <%= f.text_field :first_name %><br />
    <%= f.label :last_name %><br />
    <%= f.text_field :last_name %><br />
    <%= f.label :email1 %><br />
    <%= f.text_field :email1 %><br />
    <%= f.label :home_phone %><br />
    <%= f.text_field :home_phone %><br />
    <%= f.submit "Add person" %>

<% end %>

Here are the models:

class Location < ActiveRecord::Base

    belongs_to :organization

    has_many :persons, :as => :linkable
    has_one :address, :as => :addressable

    scope :primary, where('locations.primary_location = ?', true)

    accepts_nested_attributes_for :address

end

class Person < ActiveRecord::Base

    belongs_to :linkable, :polymorphic => true

end

The association method @person = location.persons.build works fine in the Rails Console. It sets the 'linkable_id' field to 1 and the 'linkable_type' field to 'Location'. However, after submitting the form the Person is created but these two fields are left blank.

Any help with this problem will be greatly appreciated.

Upvotes: 3

Views: 773

Answers (1)

Arun Kumar Arjunan
Arun Kumar Arjunan

Reputation: 6857

You are building the person object in the new action. You have to build the same in the create action as well..

def create
  # location = Calculate location here
  @person = location.persons.build(params[:person])
  if @person.save
    flash[:success] = "Person added successfully"
    redirect_to account_path(params[:account_id])
  else
    render 'new'
  end
end

Upvotes: 3

Related Questions