Captcha conception

Hi guys, the next problem:

I create a controller, (/controllers/rmagick_controller.rb), which have
aim to test an captcha

Actions:
def download # creates an captcha image
def show # show the page where image took place
def check # must check right captcha or wrong

views/rmagick/show.html.erb:

<div id="captcha">
<p><%= image_tag download_rmagick_path %></p>

<p><% form_tag check_rmagick_path do %>
    <p><%= text_field_tag :captcha %></p>
    <p><%= submit_tag "Submit" %></p>
   <% end %>
</p>
</div>

config/routes.rb:

resources :rmagick do
   get "download", :on => :member
   get "check", :on => :member
end

So, there are 2 problems:

1) Routes problem. If I'm write in config/routes.rb something like this:

get "rmagick/show"
get "rmagick/download"
get "rmagick/check"

I catch this output:

No route matches {:action=>"download", :controller=>"rmagick"}

But I'm place get "rmagick/download" in routes.rb. Why it doesn't work?
(it can't find download_rmagick_path)

So, if I use resources :rmagick do ... I see an show.html.erb when i
write something other than "show" text, ie in this link
127.0.0.1:3000/rmagick/jjvniuv I also will see show action.why? How I
can change this? Where is the problem?

2) Problem with form_tag. So, you see the code above. When I put captcha
value and press "submit" button, I don't go to rmagick/check, I go to
rmagick/show/check. Why?

3) When I'll create all of this, how I can do interaction between other
pages and captcha?

Hi guys, the next problem:

I create a controller, (/controllers/rmagick_controller.rb), which have
aim to test an captcha

Actions:
def download # creates an captcha image
def show # show the page where image took place
def check # must check right captcha or wrong

views/rmagick/show.html.erb:

> <div id="captcha">
> <p><%= image_tag download_rmagick_path %></p>

> <p><% form_tag check_rmagick_path do %>
> <p><%= text_field_tag :captcha %></p>
> <p><%= submit_tag "Submit" %></p>
> <% end %>
> </p>
> </div>

config/routes.rb:

> resources :rmagick do
> get "download", :on => :member
> get "check", :on => :member
> end

Rails understand this as creating urls like rmagick/123/download, i.e.
it things there are actual rmagick entities which supports a download
action
This means that when you call download_rmagick_path rails is expecting
you to supply it with the id of the rmagick entity. If you don't rails
won't be able to generate a url. You'd probably need to either switch
to a singleton resource, make those actions collection actions, use
match rather than creating a resource. The rails routing guide should
explain the difference between these actions

So, there are 2 problems:

1) Routes problem. If I'm write in config/routes.rb something like this:

> get "rmagick/show"
> get "rmagick/download"
> get "rmagick/check"

I catch this output:> No route matches {:action=>"download", :controller=>"rmagick"}

But I'm place get "rmagick/download" in routes.rb. Why it doesn't work?
(it can't find download_rmagick_path)

So, if I use resources :rmagick do ... I see an show.html.erb when i
write something other than "show" text, ie in this link
127.0.0.1:3000/rmagick/jjvniuv I also will see show action.why? How I
can change this? Where is the problem?

That's what it's supposed to do - given the routes you've defined, /
rmagick/jjvniuv is the path for the rmagick entity with the id jjvniuv

2) Problem with form_tag. So, you see the code above. When I put captcha
value and press "submit" button, I don't go to rmagick/check, I go to
rmagick/show/check. Why?

I'm surprised it does anything at all. You've got the same problem as
earlier - a route that is expecting an id, but you're not giving it an
id.
You might also want to look at the recaptcha captcha - it's very easy
to integrate

Fred

Thanks, Fred.

You might also want to look at the recaptcha captcha - it's very easy
to integrate

But I want my own captcha.

Fred, now I'm

You'd probably need to either switch
to a singleton resource, make those actions collection actions, use
match rather than creating a resource.

Can you explain example, what I must to do? Guide "Rails routing from
outside in" not gived clarity to me.

3) So, when I create a methods that can create captcha image and check
it, what i must do next?

Fred, now I'm> You'd probably need to either switch
> to a singleton resource, make those actions collection actions, use
> match rather than creating a resource.

Can you explain example, what I must to do? Guide "Rails routing from
outside in" not gived clarity to me.

3) So, when I create a methods that can create captcha image and check
it, what i must do next?

I think you need to think about this bit first - the right routes will
depend on how this is going to be used. For example, I don't think you
need a check action for the captcha - the user's answer to the captcha
would be submitted along with the other information they're supplying
and verification done in the controller. The only captcha specific
action I think you need is the one that actually produces the image.
The form probably also needs to contain enough information to allow
you to know which captcha the user is solving. You'll probably also
want to ensure that the same captcha/answer can't be used by someone
over and over again.
Even if you want to write your own, you might find existing captcha
systems a useful source of inspiration.

Fred

Fred

Fred, I understand a simple_captcha conception. Now I faced with this
problem:

I create an captcha_controller.rb, when in def generate... end I put a
code to create captcha image.

Then I write in config/routes.rb:

match 'captcha' => 'captcha/generate'

And in _generator.html.erb:

<%= image_tag(captcha_path) %>

So, I have this error, when I open 127.0.0.1:3000/captcha:

ActionController::RoutingError (uninitialized constant Captcha):

Why this error occured?

Fred, I understand a simple_captcha conception. Now I faced with this
problem:

I create an captcha_controller.rb, when in def generate... end I put a
code to create captcha image.

Then I write in config/routes.rb:

> match 'captcha' => 'captcha/generate'

You probably want 'captcha#generate' rather than 'captcha/generate' -
with what you've got I think rails will look for
Captcha::GenerateController instead of routing to the generate action
of CaptchaController

Fred

Thanks, this really works. Can you tell me lesson of rails routing other
than guides.rubyonrails.org? (I cannot understand some things here)

So, I have another one problem. How can I do a method in controller,
that the same ".valid_with_captcha?"

When I puts to application_controller.rb

def valid_with_captcha?
if self.valid? and captcha_valid? then true else false end
end

And, supposably, in users_controller.rb

def update
if @user.valid_with_captcha?
save_code
end
end

When I'm updating, I see this:

undefined method `valid_with_captcha?' for #<User:0x00000003f8e6b8>

What's wrong?

bump!