2013-05-07 3 views
1

У меня возникла проблема с созданием объекта с ассоциацией.Ruby on rails: проблема с созданием объекта с несколькими ассоциациями

У меня есть модель сообщений, которая принадлежит заданию, а также пользователю или бегун. Внутри моей работы/index.html Я хочу показать список заданий с соответствующими сообщениями и формой для создания нового сообщения для этой конкретной работы.

Проблема в том, что когда я создаю сообщение, job_id остается ноль. Я новичок в рубинах на рельсах, поэтому я до сих пор не понимаю этого.

Вот часть моих работ/index.html (ПРИМЕЧАНИЕ: не мой фактический код, я в классе, поэтому я просто набрал это, может содержать синтаксические ошибки).

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

Вот создать метод контроллера сообщения (Примечание: current_login может быть бегуном или пользователем, они оба разделяют те же атрибуты)

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

индекс контроллера Работы действие

def index 
    @jobs = Job.all 
end 

Модель сообщения

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

модель пользователя

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

Runner модель

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

модель работы

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

Всякий раз, когда я отправить форму сообщения внутри вида работы/index.html, это, кажется, успешно создать сообщение с user_id или runner_id успешно заполнено (в зависимости от того, кто отправил сообщение), но я получаю нуль для атрибута job_id.

ответ

1

Поскольку ваше сообщение относится к заданию, я думаю, что вы должны создавать вложенные ресурсы в форме заданий.

Ваша функция new контроллера внутри модели рабочих мест должна строить ассоциацию так:

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

вашей создать модель просто необходима, чтобы сохранить родительскую модель:

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

Для много подробной информации о как это сделать, посмотрите этот railscast: http://railscasts.com/episodes/196-nested-model-form-part-1

Я также должен добавить, если вы просто пытаетесь создать объявление d сообщение к существующему заданию, просто передайте параметр для job_id правильно в своей форме и убедитесь, что задание, на которое вы ссылаетесь, действительно существует.

+0

Я не знаю, могу ли я это сделать, новый используется для создания новых заданий, а не сообщений. – user2158382

+0

уверен, что вы можете.посмотреть видео, которое я только что добавил в свой ответ – Kristian

+0

Спасибо, это видео было полезно, но оно не решило мою проблему. – user2158382

0

Чтобы решить эту проблему, я решил вручную создать связь между сообщением и заданием, которым он принадлежит, через скрытое поле в форме.

    <%= 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 %> 
Смежные вопросы