1

I am having a problem with creating an object with an association.

I have a Message model that belongs_to a job, and a user or runner. Inside my jobs/index.html I want to show a list of jobs with their corresponding messages and a form to create a new message for that particular job.

The problem is whenever I create a message, job_id stays nil. I am new to ruby on rails, so I still dont fully understand this stuff.

Here is part of my jobs/index.html (NOTE: not my actual code, I am in class so I just typed this up, may contain syntax errors).

    <% @jobs.each do |job| %>

      <p> <%= job.body %> </p>

      <%= form_for job.messages do |f| %>
        <%= f.label :body %>
        <%= f.text_field :body %>
        <%= f.submit %>
      <% end %>

      <%if job.messages.present? %>
      <ul>
        <% job.messages.each do |message| %>
            <li>
                <p> message.description <p>
            </li>
        <% end %>
      </ul>
      <% else %>
        <p> No messages <p>
      <% end %>

    <% end %>

Here is the create method in message controller (NOTE: current_login can be a runner or user, they both share the same attributes)

def create
    @message = current_login.messages.new(params[:message])
    @message.save
end

Job controller index action

def index
    @jobs = Job.all
end

Message model

class Message < ActiveRecord::Base
  attr_accessible :description
  belongs_to :user
  belongs_to :runner
  belongs_to :job
end

User model

class User < ActiveRecord::Base
  attr_accessible :username
  has_many :jobs
end

Runner model

class Runner < ActiveRecord::Base
  attr_accessible :username
  has_many :jobs
end

Job model

class Job < ActiveRecord::Base
  attr_accessible :body
  has_many :messages
  belongs_to :user
  belongs_to :runner
end

Whenever I submit the message form inside the jobs/index.html view, it seems to successfully create a message with user_id or runner_id successfully filled out (depending on who posted the message), but I am getting nil for the job_id attribute.

2 Answers 2

1

Since your message belongs to job, i think you should be creating the nested resources within the jobs form.

Your new controller function inside the jobs model should build the association like so:

def new
    @job = Job.new(params[:job])
    @message = @job.build_message
end

your create model just needs to save the parent model:

def create
    @job = Job.create(params[:job])
end

For lots of detailed information on how to do this, watch this railscast: http://railscasts.com/episodes/196-nested-model-form-part-1

I should also add, if you are simply trying to add a message to an existing job, just pass the parameter for the job_id correctly in your form, AND make sure the job you're referencing actually exists.

Sign up to request clarification or add additional context in comments.

3 Comments

I dont know if i can do this, new is used for creating new jobs not messages.
sure you can. watch the video i just added to my response
Thank you, that video was helpful, but it did not solve my problem.
0

To solve this problem, I decided to manually create the tie between the message and the job it belongs to through a hidden field in the form.

                  <%= form_for(@message) do |f| %>
                    <%= f.label :body, "Description" %>
                    <%= f.text_area :body %>
                    <%= f.hidden_field :job_id, value: job.id %>
                    <%= f.submit 'Create message', class: 'button small secondary' %>
                  <% end %>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.