简体   繁体   中英

Ruby on rails: Trouble creating an object with multiple associations

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.

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.

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 %>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM