# REST bug with form\_for

**URL:** <https://www.ruby-forum.com/t/rest-bug-with-form-for/122036>\
**Category:** Rails\
**Created:** [December 4, 2007, 1:23am UTC](https://www.ruby-forum.com/t/rest-bug-with-form-for/122036 "2007-12-04T01:23:56Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![dangermoose](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/e79b87/32.png) [@dangermoose](https://www.ruby-forum.com/u/dangermoose)\
**Post date:** [December 4, 2007, 1:23am UTC](https://www.ruby-forum.com/t/rest-bug-with-form-for/122036/1 "2007-12-04T01:23:56Z")

</div>

Hi all, I am running on Windows XP sp2 with ruby 1.8.6, and rails  
1.2.3

I am using REST, and have this in my view

\<% form\_for(:project,  
:url =\> project\_path(:user\_id =\> @project.my\_user, :id =\>  
@project),  
:html =\> {:method =\> :put}) do |f| %\>

The browser correctly gives

But yet when I hit the Submit button to update, I get this error:

project\_url failed to generate from  
{:controller=\>“projects”, :user\_id=\>nil, :action=\>“show”, :id=\>“1”},  
expected: {:controller=\>“projects”, :action=\>“show”}, diff:  
{:user\_id=\>nil, :id=\>“1”}

Something is very wrong, because the routing should be sending it to  
the update – not the show action.

My guess is that this is a Windows specific bug.  
Please advise.

---

<div class="post-metadata">

**Author:** ![dangermoose](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/e79b87/32.png) [@dangermoose](https://www.ruby-forum.com/u/dangermoose)\
**Post date:** [December 4, 2007, 4:28am UTC](https://www.ruby-forum.com/t/rest-bug-with-form-for/122036/2 "2007-12-04T04:28:43Z")

</div>

Can you show your routes.rb file?

---

<div class="post-metadata">

**Author:** ![dangermoose](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/e79b87/32.png) [@dangermoose](https://www.ruby-forum.com/u/dangermoose)\
**Post date:** [December 4, 2007, 9:50pm UTC](https://www.ruby-forum.com/t/rest-bug-with-form-for/122036/3 "2007-12-04T21:50:50Z")

</div>

## Here’s routes.rb (note that the commented out streamlined version doesn’t help):

ActionController::Routing::Routes.draw do |map|

map.resources :users, :collection =\> {:login =\> :get, :confirm\_login  
=\> :post} do | user |  
user.resources :projects do | project |  
project.resources :calendar\_entries, :to\_do\_items  
project.resources :research\_items do | research\_item |  
research\_item.resources :url\_links  
end  
end  
end

# map.resources :users do | users |

# users.resources :projects

# end

## end

---

<div class="post-metadata">

**Author:** ![dangermoose](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/e79b87/32.png) [@dangermoose](https://www.ruby-forum.com/u/dangermoose)\
**Post date:** [December 5, 2007, 12:36am UTC](https://www.ruby-forum.com/t/rest-bug-with-form-for/122036/4 "2007-12-05T00:36:58Z")

</div>

> > My guess is that this is a Windows specific bug.

99% of the time in a programming language, bugs are NOT OS SPECIFIC.

Show us the controller code for the action that it’s posting to please.  
Somewhere in there you’re not setting a user\_id object correctly.

On Dec 5, 2007 7:20 AM, Paul D. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ```
> project.resources :calendar_entries, :to_do_items
> 
> ```
> 
> > > {:controller=\>“projects”, :user\_id=\>nil, :action=\>“show”, :id=\>“1”},

–  
Ryan B.

---

<div class="post-metadata">

**Author:** ![dangermoose](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/e79b87/32.png) [@dangermoose](https://www.ruby-forum.com/u/dangermoose)\
**Post date:** [December 5, 2007, 9:52pm UTC](https://www.ruby-forum.com/t/rest-bug-with-form-for/122036/5 "2007-12-05T21:52:59Z")

</div>

Furthermore, using a breakpoint called from controller.temp1() in  
\views\projects\edit.rhtml:

\<% form\_for(:project,  
:url =\> project\_path(:user\_id =\> @project.my\_user, :id =\>  
@project),  
:html =\> {:method =\> :put}) do |f| %\>  
\<% controller.temp1() %\>

wherein projects\_controller.rb,

def temp1()  
breakpoint()  
end

The url works just fine giving me “/users/2/projects/1” as follows:

# Executing break point at C:/SVNWorkingCopy/app/controllers/ projects\_controller.rb:8 in `temp1’ irb(#ProjectsController:0x4867e9c):001:0\> project\_path(:user\_id =\> @project.my\_user, :id =\> @project) =\> “/users/2/projects/1” irb(#ProjectsController:0x4867e9c):002:0\>

=========================

---

<div class="post-metadata">

**Author:** ![dangermoose](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/e79b87/32.png) [@dangermoose](https://www.ruby-forum.com/u/dangermoose)\
**Post date:** [December 5, 2007, 8:55pm UTC](https://www.ruby-forum.com/t/rest-bug-with-form-for/122036/6 "2007-12-05T20:55:28Z")

</div>

Ok, here’s projects\_controller.rb:

=========================  
class ProjectsController \< ApplicationController

live\_tree(  
:project\_tree,  
:model =\> :project)

def temp1()  
#breakpoint()  
end

# GET /users/1/projects

# GET /users/1/projects.xml

def index  
find\_user\_from\_params()  
find\_parent()  
@child\_projects = projects\_sorted\_by\_title()  
end

# GET /users/1/projects/1

# GET /users/1/projects/1.xml

def show  
find\_project\_and\_parent()  
end

# GET /users/1/projects/new

def new  
find\_parent()  
@project = Project.new  
end

# GET /users/1/projects/1;edit

def edit  
find\_project()  
#@user = @project.my\_user  
#breakpoint()  
end

# POST /users/1/projects

# POST /users/1/projects.xml

def create  
find\_parent()  
@project = Project.new(params[:project])  
@user.add\_child\_to\_parent\_project(@project, @parent\_project)

```
if @project.save
  flash[:notice] = 'Project was successfully created.'
  redirect_to project_url(:user_id => @user, :id => @project)
else
  render :action => "new"
end

```

end

# PUT /users/1/projects/1

# PUT /users/1/projects/1.xml

def update  
find\_project()  
if @project.update\_attributes(params[:project])  
flash[:notice] = ‘Project was successfully updated.’  
redirect\_to project\_url(:user\_id =\> @user, :id =\> @project)  
else  
render :action =\> “edit”  
end  
end

# DELETE /users/1/projects/1

# DELETE /users/1/projects/1.xml

def destroy  
find\_project\_and\_parent()  
find\_user()  
@project.my\_user.remove\_child\_project(@project)  
@project.destroy()  
redirect\_to projects\_url(:parent\_project\_id =\>  
@parent\_project, :user\_id =\> @user)  
end

private

def find\_user\_from\_params()  
an\_id = params[:user\_id]  
redirect\_to login\_users\_url unless an\_id  
@user = User.find(an\_id)  
end

def find\_project()  
@project = Project.find(params[:id])  
end

def find\_project\_and\_parent()  
find\_project()  
@parent\_project = @project.parent  
end

def find\_parent()  
an\_id = params[:parent\_project\_id]  
@parent\_project = ((an\_id.nil?) ? nil : Project.find(an\_id))  
end

def projects\_sorted\_by\_title()

@user.children\_for\_parent\_project\_\_sorted\_by\_title(@parent\_project)  
end

# end

And while we’re at it, here’s application.rb:

=========================

# Filters added to this controller apply to all controllers in the

application.

# Likewise, all the methods added will be available for all

controllers.

class ApplicationController \< ActionController::Base

# Pick a unique cookie name to distinguish our session data from

others’  
session :session\_key =\> ‘\_pjd1\_session\_id’

# end

=========================

---

<div class="post-metadata">

**Author:** ![dangermoose](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/e79b87/32.png) [@dangermoose](https://www.ruby-forum.com/u/dangermoose)\
**Post date:** [December 5, 2007, 10:41pm UTC](https://www.ruby-forum.com/t/rest-bug-with-form-for/122036/7 "2007-12-05T22:41:45Z")

</div>

the project\_url is also called on the redirect from the update  
method.

it does not look like you are setting the @user variable in that  
method.

daniel

---

<div class="post-metadata">

**Author:** ![dangermoose](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/e79b87/32.png) [@dangermoose](https://www.ruby-forum.com/u/dangermoose)\
**Post date:** [December 5, 2007, 11:29pm UTC](https://www.ruby-forum.com/t/rest-bug-with-form-for/122036/8 "2007-12-05T23:29:10Z")

</div>

Yup, that was it.  
I should have put a break in the update method to see if it was  
getting there.  
Thanks all.
