开发者

Problems adding a relationship in edit, not new

I'm trying to build a form for an "Incident" that allows users to add notes (text fields) to it dynamically with some javascript. So when they click an "Add Note" button in the form, a text field pops up and they can add a note. If they click it again, another field will show up. So far this works fine when creating a new incident, but when I edit the incident and add a new field, it doesn't pick 开发者_高级运维up the relationship between incident_note and user.

For example, here is what I see when I create a new incident.

 INSERT INTO "incident_notes" ("created_at", "updated_at", "user_id", "note", "incident_id") VALUES('2010-07-02 14:07:42', '2010-07-02 14:07:42', 2, 'A Note', 8)

As you can see, the user_id field has a number assigned to it. But here is what happens during the edit when I add another note:

INSERT INTO "incident_notes" ("created_at", "updated_at", "user_id", "note", "incident_id") VALUES('2010-07-02 14:09:11', '2010-07-02 14:09:11', NULL, 'Another note', 8)

The user_id is NULL. I'm not sure what I've done. The code is very similar for both "edit" and "new" in the controller.

I have the following models and relationships (only showing the relevant sections):

class Incident < ActiveRecord::Base
  has_many                :incident_notes
  belongs_to              :user
end

class IncidentNote < ActiveRecord::Base
  belongs_to :incident
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :incidents
  has_many :incident_notes
end

Here is the relevant part of the new form (the edit is essentially the same):

<% form_for([@customer,@incident]) do |f| %>
  <p>
    <% f.fields_for :incident_notes do |inf| %>
      <%= render "incident_note_fields", :f => inf %>
    <% end %>
    <p><%= link_to_add_fields "Add Note", f, :incident_notes %></p>
  </p>
  <p>
    <%= f.submit "Create" %>
  </p>
<% end %>

And here are the create and update methods in the Incident controller.

def create
  @incident = @customer.incidents.build(params[:incident])
  @incident.capc_id = generate_capc_id
  for inote in @incident.incident_notes
    (inote.user = current_user) if (inote.user == nil)
  end

  respond_to do |format|
    if @incident.save #etc
end

def update
  @incident = @customer.incidents.find(params[:id])
  for inote in @incident.incident_notes
    (inote.user = current_user) if (inote.user == nil)
  end

  respond_to do |format|
    if @incident.update_attributes(params[:incident])
    #etc
end

There may be a better way to do this, but as you can see in the "create" method I had to manually set the incident_note user field to the current user. This works fine, but the same does not seem to work in the update method.

Any ideas, suggestions, and help will be much appeciated! I'm very stuck at the moment. :)


I suggest that you don't have incident_notes directly belonging to user. In other words a user has many incidents and an incident has many incident notes.

class Incident < ActiveRecord::Base
  has_many                :incident_notes
  belongs_to              :user
end

class IncidentNote < ActiveRecord::Base
  belongs_to :incident
end

class User < ActiveRecord::Base
  has_many :incidents
  has_many :incident_notes, :through => :incident
end

The user's incident notes are then obtained through her incidents model

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜