HABTM Problem

Hi All,

I have a form that is creating a ticket model. I am trying to allow the user to assign employee's to this newly created ticket model. I followed the complex form's railscast, which helped a lot it but it appears the screencast is for creating two new models, instead of just creating one model and linking an existing model to it. My problem is I am just trying to assign employee's to the ticket model and not create two new models.

This is the I have so far, which is giving me no errors, it is just not putting any new data into my employees_tickets table.

TicketsController

class TicketsController < ApplicationController layout 'global'   def new     @employees = Employee.find(:all)     @ticket = Ticket.new     @ticket.employees.build   end

  def create     @ticket = Ticket.new(params[:ticket])     if @ticket.save       flash[:notice] = "Successfully created ticket."       redirect_to :action => "list", :controller => "workorders"     else       render :action => 'new'     end   end end

Ticket Model class Ticket < ActiveRecord::Base   has_and_belongs_to_many :employees end

Employee Model class Employee < ActiveRecord::Base   has_and_belongs_to_many :tickets end

Create Ticket new.rhtml

<h1>Create Dispatch Ticket</h1>

<% form_for :ticket, :url => { :action => :create } do |form| %> <p> <label class="inputlabel">Address</label> <%= text_field :ticket, :address %> </p>

<p> <label class="inputlabel">City</label> <%= text_field :ticket, :city %> </p>

<h2>Employees</h2>

<% for employee in @ticket.employees %>   <% fields_for "ticket.employee", employee do |employee_form| %>     <table style="width: 200px">       <% for employee in @employees %>         <tr>           <td><%= employee.name %></td><td><%= employee_form.check_box :id %></td>         </tr>       <% end %>     </table>   <% end %> <% end %>

<br> <%= submit_tag "Create", :class => "submit" %>

<% end if @ticket.new_record? %>

I tried simplifying things a bit but no luck either.

View:

<table style="width: 200px"> <% for employee in @employees %> <tr>   <td><%= employee.name %></td><td><%= check_box_tag ("ticket[employee_ids]", employee.id) %></td> </tr> <% end %> </table>

Controller: class TicketsController < ApplicationController layout 'global'   def new     @employees = Employee.find(:all)     @ticket = Ticket.new   end

  def create     @ticket = Ticket.new(params[:ticket])     @ticket.employees = Employee.find(@params[:employee_ids])     if @ticket.save       flash[:notice] = "Successfully created ticket."       redirect_to :action => "list", :controller => "workorders"     else       render :action => 'new'     end   end

Error: NoMethodError in TicketsController#create

You have a nil object when you didn't expect it! You might have expected an instance of ActiveRecord::Base. The error occurred while evaluating nil.

Recently I was implementing PDF generation for a project utilizing the fantastic library Prince XML (http://www.princexml.com). I came across a blog article with a basic library and helper set for Prince (http://sublog.subimage.com/articles/2007/05/29/html-css-to-pdf-using-ruby-on-rails), which provided a great basis. I wanted to make something a little more generalized and in-keeping the Rails Way, so I have created 'Princely', a simple wrapper utilizing much of the code from the SubImage library but giving it better helpers and pluginizing its inclusion.

== Installation ==

The first step is to download Prince (Prince - Download Prince 14.3) and install it on your platform of choice (only Linux and Mac OS X supported by the plugin at this time). Next, simply install the plugin:

script/install plugin http://svn.intridea.com/svn/public/princely

You are now ready to get started using Princely to generate PDF. Note that Princely is only compatible with Rails >= 2.0

== Usage ==

Princely uses the MimeTypes and respond_to blocks from Rails 2.0 to add PDF as a render option and a format. Because of this, it's incredibly easy to implement a PDF! Simply make your XHTML or XML template and use pdf as the format (e.g. show.pdf.erb), then add code similar to this in your controller:

class PagesController < ApplicationController    def show      respond_to do |format|        format.html        format.pdf {          render :pdf => @page.pdf_name,                 :template => "show.pdf.erb", # not required, shown for example                 :layout => false # not required        }      end    end end

And that's all there is to it! If you add a .pdf to your properly routed path, you should be presented with a PDF version of the page generated by Prince. The README (http://svn.intridea.com/svn/public/princely/README) has more detailed usage information.

There is a Trac (http://trac.intridea.com/trac/public/) available for any bugs or patches you might come across. Additionally you can comment on this at the original blog post (http://www.intridea.com/2007/12/20/announcing-princely-rails-prince-xml-pdf-wrapper).