STI and form_for problem
form-for, ruby-on-rails, sti
Solution
Here's the source of your problem. This is setting @project as an instance of a TechDesign object.
def edit
@project = Project.find(params[:id])
end
You can ensure things work the way you want by specifying :project for a name in the form_for call.
<% form_for(:project, @project, :url => {:controller => "projects",:action => "update"}) do |f| %>
...
<%= submit_tag 'Update' %>
<% end %>
Problem
I am using Single Table Inheritance for managing different types of projects. Models: ``` class Project < ActiveRecord::Base end class SiteDesign < Project end class TechDesign < Project end ``` Edit action from projects_controller: ``` def edit @project = Project.find(params[:id]) end ``` View edit.html.erb: ``` <% form_for(@project, :url => {:controller => "projects",:action => "update"}) do |f| %> ... <%= submit_tag 'Update' %> <% end %> ``` Update action of projects_controller: ``` def update @project = Project.find(params[:id]) respond_to do |format| if @project.update_attributes(params[:project]) @project.type = params[:project][:type] @project.save flash[:notice] = 'Project was successfully updated.' format.html { redirect_to(@project) } format.xml { head :ok } else format.html { render :action => "edit" } format.xml { render :xml => @project.errors, :status => :unprocessable_entity } end end end ``` Then i do some edits of TechDesign entry on edit view and get error: ``` NoMethodError in ProjectsController#update 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.[] ``` In parametrs it is obvious that instead of project parameter name i have tech_design Parameters: ``` {"commit"=>"Update", "_method"=>"put", "authenticity_token"=>"pd9Mf7VBw+dv9MGWphe6BYwGDRJHEJ1x0RrG9hzirs8=", "id"=>"15", "tech_design"=>{"name"=>"ech", "concept"=>"efds", "type"=>"TechDesign", "client_id"=>"41", "description"=>"tech"}} ``` How to fix it?