Question: Stopping insertion in rest controller

Tough finding a subject line that’s fitting.

Anyway , I have a REST controller with a model called Cdetail.
I am only allowing 1 record per user for this table and want the app
to redirect with a flash message if they’ve already inserted one.

So here is my new method:
def new
@cdetail = Cdetail.new # Don’t think I actually need this here
@uid = current_user.id
end

and here is the create method:
def create

if
Cdetail.find_by_user_id(@uid) == true
flash[:notice] = "Allowed only one record"
redirect_to(:controller => 'index', :action => 'index')
end

@cdetail = Cdetail.new(params[:cdetail])
@cdetail.save!

I’m a newb so trying to remember what I’ve learned as I go along
(still going back to book)
but I expect the if statement if it finds a record for the
current_user in the method (column) user_id it would redirect away
from the create method, however it’s not doing so. It’s not throwing
an error either but …
I suppose this is what happens when a Ruby N. jumps to quickly into
Rails :slight_smile:

Some direction or advice would be greatly appreciated.
Stuart

On 9/19/06, Dark A. [email protected] wrote:

@cdetail = Cdetail.new # Don’t think I actually need this here
end

@cdetail = Cdetail.new(params[:cdetail])
@cdetail.save!

First thing I noticed was the use of @uid in create - this won’t do what
you
think.
Instance variables are not persistent across requests. Either store
the
user id
in session[] or just use current_user.id.

Second, the condition above will never be true - Ruby’s evaluation of
conditionals
is more like “!= nil” than “== true” - any value other than nil is
evaluated
as true.
However, Cdetail.find_by_user_id will return an instance of Cdetail,
which
is
definitely not == to true (the single instance of TrueClass). Leaving
off
the
“== true” part will do what you want.

A final note - judging from the class names, I’m guessing that you’re
creating
a mechanism for users to add details to a profile of some sort. It isn’t
clear
to me that straight CRUD is a suitable method for doing this - wouldn’t
it
make
more sense for a user to ‘edit’ their details, even if they didn’t
previously exist?
If the methods are split, it still might be better to remove the
“create”
option
altogether if a user’s details already exist. It might even be better to
move
the Cdetail controller’s work into the User controller, using the ;
notation
to
map the action, so that

GET /users/1;edit_details

would show the form for User id 1, and

PUT /users/1;details

would commit the edit.

Good luck!

Matt J.
[email protected]
President/Technical Director, Acme Art Company (acmeartco.org)

On 9/19/06, Matt J. [email protected] wrote:

So here is my new method:
flash[:notice] = “Allowed only one record”
Instance variables are not persistent across requests. Either store the
the
If the methods are split, it still might be better to remove the “create”

PUT /users/1;details

would commit the edit.

Good luck!

Thanks for a great explanation Matt. You understand exactly what I’m
doing. I’m not entirely sure yet why I want to keep the two seperate
other then I want people to be able to get a feel for the sytem (but
requiring a brief registration ) and then later make more of a
committment if they feel it’s beneficial to do a full blown profile.
However some good suggestions and I’ll be looking at perhaps a better
way to get the informaton.

Stuart