LogIn Button using remote_function

I am trying to make a very simple login page that has light-box like
features. The only thing I cannot get to work is the behavior of the
actual login button.
When you click on it it does nothing. I simply want to submit the info
given by the client and redirect either to a private page or make the
client log in again. Here is the code for my log in box view:

User name: <%= text_field("userform", "user_name",:size=>"20" ) %>
Password: <%= password_field("userform", "password",:size=>"20" ) %>
<%= javascript_include_tag :defaults %> <%= submit_tag 'LOG IN', :onclick =>remote_function(:url => {:action => :authenticate, } ) %>

And here is the code from my controller for the authentication action I
am calling on:

class UserController < ApplicationController
def authenticate
@user = User.new(params[:userform])
valid_user = User.find(:first,:conditions => ["user_name = ? and
password = ? ",@user.user_name, @user.password])
if valid_user
session[:user_id]=valid_user.user_name
redirect_to :action => ‘private’
else
flash[:notice] = “Invalid User/Password”
redirect_to :action=> ‘login’
end
end
def login
end
def private
if !session[:user_id]
redirect_to :action=> ‘login’
end
end
def logout
if session[:user_id]
reset_session
redirect_to :action=> ‘login’
end
end
end

When I tried typing the code
submit_tag ‘LOG IN’, :onclick =>remote_function(:url =>
{:action => :authenticate, } )
into irb, I got this error message:
NoMethodError: undefined method `remote_function’ for main:Object

There may be a simple error that I am making, as I am pretty new to the
ruby language. Also, if anyone knows another way to do this that will
work with the partial rendering I use to display the login box, that
would be fine, too.

On Jul 10, 10:13 pm, Julia L. [email protected]
wrote:

Because you’re just using an onclick on the submit tag this isn’t
going to know that you want it to submit these form parameters. Why
not use remote_form_for ?
It’s also pretty weird to have the tags to load javascript where you
have put them.

        redirect_to :action => 'private'
    else
        flash[:notice] = "Invalid User/Password"
        redirect_to :action=> 'login'
    end

You’ve not told remote_function that you want to update a page element
so unless you send back some javascript. You’re just doing a redirect
in your authenticate action, however that redirect just redirects the
ajax request you made - it won’t affect the page the user is on at
all. if you actually wanted to redirect them to the private page you
would need to use rjs (or generate the appropriate javascript by
hand). If what you wanted was to redirect them to the private action
then why use ajax at all ?

When I tried typing the code
submit_tag ‘LOG IN’, :onclick =>remote_function(:url =>
{:action => :authenticate, } )
into irb, I got this error message:
NoMethodError: undefined method `remote_function’ for main:Object

That’s because functions like remote_function are only included in
your views. If you use rails’ script/console there is an object called
something like helpers which has the various view helper methods
included.

Fred

Thanks so much for the feedback Fred!
This is my first rails project that I’m writing, so I need lots of help.
The java script tags were an error I noticed right after I posted, I
usually put it in the head. Not intentional.
But, as far as the many real problems with my code, could you give me
some idea of how it should look corrected? I’m starting with nothing,
pretty much, so any hint would help.

Frederick C. wrote:

On Jul 10, 10:13�pm, Julia L. [email protected]
wrote:

Because you’re just using an onclick on the submit tag this isn’t
going to know that you want it to submit these form parameters. Why
not use remote_form_for ?
It’s also pretty weird to have the tags to load javascript where you
have put them.

� � � � � � redirect_to :action => ‘private’
� � � � else
� � � � � � flash[:notice] = “Invalid User/Password”
� � � � � � redirect_to :action=> ‘login’
� � � � end

You’ve not told remote_function that you want to update a page element
so unless you send back some javascript. You’re just doing a redirect
in your authenticate action, however that redirect just redirects the
ajax request you made - it won’t affect the page the user is on at
all. if you actually wanted to redirect them to the private page you
would need to use rjs (or generate the appropriate javascript by
hand). If what you wanted was to redirect them to the private action
then why use ajax at all ?

When I tried typing the code
�submit_tag ‘LOG IN’, :onclick =>remote_function(:url =>
{:action => :authenticate, } )
into irb, I got this error message:
NoMethodError: undefined method `remote_function’ for main:Object

That’s because functions like remote_function are only included in
your views. If you use rails’ script/console there is an object called
something like helpers which has the various view helper methods
included.

Fred

Also,

I’d recommend following this set of screen learning apps (they are free)

http://www.buildingwebapps.com/learningrails

When you get to lesson 11, it covers user authentication in great
detail.

On Jul 10, 11:11 pm, Julia L. [email protected]
wrote:

Thanks so much for the feedback Fred!
This is my first rails project that I’m writing, so I need lots of help.
The java script tags were an error I noticed right after I posted, I
usually put it in the head. Not intentional.
But, as far as the many real problems with my code, could you give me
some idea of how it should look corrected? I’m starting with nothing,
pretty much, so any hint would help.

I made a few suggestions in a previous message. Did you try any of
them ? Also when you say nothing happened it would be helpful if you
could clarify what sort of nothing: nothing changed visually on the
page, or no ajax request was made, or one was made but your server did
not respond to the request, something else ? You may find firebug
useful for diagnosing this sort of thing (and i’d very much recommend
that you start by working out exactly why things aren’t working)

Fred

Hi Julia,

First, I’ll touch on some of the things you may or may not know.

IRB is something you use to test ruby code, specific to the ruby
interpreter.
script/console or the Rails console is what you use to test rails code,
specific to rails.

So, it’s better to get used to using the console in rails.

Second, it appears you are trying to create your own authentication MVC.
I wouldn’t do that, especially if this is your first rails project. I
would use a plugin called Authentication…

http://agilewebdevelopment.com/plugins/restful_authentication

After using that, you can alter the way your authentication system works
or behaves but you won’t have to develop everything from scratch. It
also applies RESTful behavior to your controllers which is really what
you want to try and maintain in rails. The more restful your
controllers are, the easier they are to manage.

Let me know if you have any questions on this. I’d be happy to help.