Crazy Partials

I have this in a view:
<td id="action_<%= action.id %>">
            <%= render :partial => "new", :locals => { :game =>
@game, :action => action, :count => count } %>
          </td>
          <% elsif action.hit %>
          <td id="action_<%= action.id %>">
            <%= render :partial => "hit", :locals => { :game =>
@game, :action => action, :count => count } %>
          </td>

This in _new.html.erb
<%= link_to_remote "hit", :url => { :action => "add_hit", :id =>
action.id, :player => @game.players[count] }, :update =>
"action_#{action.id}" %> <%= link_to_remote "skip", :url => { :action
=> "add_skip", :id => action.id, :player =>
@game.players[count] }, :update => "action_#{action.id}" %>

This in partial _hit.html.erb
<%= link_to_remote "(hit)", :url => { :action => "remove_hit", :id =>
action.id, :game => @game, :count => count, :player =>
@game.players[count] }, :update => "action_#{action.id}" %>

This in _skip.html.erb
<%= link_to_remote "(skip)", :url => { :action => "remove_skip", :id
=> action.id, :game => @game, :count => count, :player =>
@game.players[count] }, :update => "action_#{action.id}" %>

This in my controller

  def add_hit
    @action = Action.find(params[:id])
    Player.find(params[:player]).actions << @action
    @action.add_hit
    render :partial => "hit", :locals => { :game =>
Game.find(params[:game].id), :action => @action, :count =>
params[:count] }
  end

  def remove_hit
    @action = Action.find(params[:id])
    @action.remove_hit
    render :partial => "new", :locals => { :game =>
Game.find(params[:game].id), :action => @action, :count =>
params[:count] }
  end

and ditto for skips

Yet I'm still getting nil errors all over the place. Have I not passed
the locals correctly? What am I doing wrong?

and ditto for skips

Yet I'm still getting nil errors all over the place. Have I not passed
the locals correctly? What am I doing wrong?

Well it's almost impossible to say for sure, because you haven't told
us where the error occurs, but for example in _hit.html.erb you're
using @game, but in add_hit you don't seem to have defined @game (did
you mean to just write game ?). The same is true for the remove_hit
action and _new.html.erb

Fred

Here's the error when I click from "hit" from the view
Here's what it passes (/games/remove_hit/153?
count=2&amp;game=7&amp;player=9)
def add_hit
@action = Action.find(params[:id])
@game = Game.find(params[:game]) #looks like it can't find game
Player.find(params[:player]).actions << @action
@action.add_hit

render :partial => "hit", :locals => { :game => @game, :action =>
@action, :count => params[:count] }
end

activerecord::recordnotfound in gamescontroller#add_hit
couldn't find game without an id
rails_root: /users/ellis/desktop/mlp

Like I said before you seem to be using @game without having set it.

Fred

I believe that Fred is right about the source of your problem.

A few other comments that might help:
  1. If you're going to pass @game into the partial as a local then
you should refer to it as game, not @game.
  2. If you're using rails 2.x, then use dom_id(@action) for the td
declaration: <td id="<%= dom_id_action %>">
  3. Since the params appear to be the same, you could simplify your
code a lot by calculating the name of the partial and then calling
render :partial once.
  4. Combine it all into something like this (note -- dom_id is used
by content_tag_for):

(controller)
@partial_name = case
  when action.hit
    'hit'
  when action.miss
    'miss'
  else
    'new'

(view)
content_tag_for :td, @action, render(:partial=>
@partial_name, :locals=>{:game =>
@game, :action => action, :count => count })

Thanks that helped a lot. I got it now.