Forum: Nitro Request#params

Posted by Robert Mela (Guest)
on 2007-10-01 04:07
Attachment: rob.vcf (117 Bytes)
(Received via mailing list)
Not sure what the intent is here in request.rb, module Raw, included in
class Context

   31    def params
   32     if method == :post
   33             @post_params.instance_variable_get("@hash")
   34     else
   35             @get_params.instance_variable_get("@hash")
   36     end
   37    end


@post_params is itself a hash and an instance variable on Context,  and
@post_params.instance_variable_get( "@hash" ) returns nil.

Anything wrong with doing this instead?

   31    def params
   32        return method == :post ? @post_params : @get_params
   33    end

If that's acceptable I'll add it to the patches I'm preparing.

thx.
Posted by Robert Mela (Guest)
on 2007-10-01 04:30
Attachment: rob.vcf (117 Bytes)
(Received via mailing list)
A second, related question --

OgAdminController#save attempts to access request data via the 'request'
method call:

klass = name_to_class(*request*['object_class_name'].to_s)
obj.assign(*request*, :assign_relations => true, :force_boolean => true)

A couple problems

  - Major misnomer: request returns a @context object
  - @request does not have a [] method for accessing incoming request
variables ( nor should it...)

I've worked around it for now by calling
@context.post_params['object_class_name'] .... which led up to the
question in my prev. email, since @context.params would be nicer...
Posted by Jonathan Buch (Guest)
on 2007-10-01 14:38
(Received via mailing list)
Hi,

> OgAdminController#save attempts to access request data via the 'request'
> method call:
>
> klass = name_to_class(*request*['object_class_name'].to_s)
> obj.assign(*request*, :assign_relations => true, :force_boolean => true)

yes, I believe that was always like that, as a shortcut to 
request.params.

> A couple problems
>
>   - Major misnomer: request returns a @context object

That I don't know about.

>   - @request does not have a [] method for accessing incoming request
> variables ( nor should it...)

Any reason why?

* request.params['foo']
* request['foo']

I use the second form all the time.

> I've worked around it for now by calling
> @context.post_params['object_class_name'] .... which led up to the
> question in my prev. email, since @context.params would be nicer...

I'm not sure I follow you here.  The parameters come from the "Request"
(requested by browser) and I'm not sure if 'context' better describes
where the parameters come from.  IMO they belong to the current
'request cycle' and not to a 'generic context'.  But mind you, that is
just generally, if Nitro returns a `Context` object when you call
`request` then that's just kind of an alias....

>>   31    def params
>>   32        return method == :post ? @post_params : @get_params
>>   33    end

I'm not sure about the contents of those, but IIRC the plan (quite a 
while
back) was to do a little more:

def params
   return method == :post ? @get_params.merge(@post_params) : 
@get_params
end

(Where I assume the @get_params is an hash.)

But that might now be obsolete when we have both .get/post_params
available.

Carry on :P

Jo
Posted by Robert Mela (Guest)
on 2007-10-01 14:41
Attachment: rob.vcf (117 Bytes)
(Received via mailing list)
Whoa.. I should proofread...

"@request does not have a [] method" should read "@context does not 
have..."
Posted by Robert Mela (Guest)
on 2007-10-01 15:27
Attachment: rob.vcf (117 Bytes)
(Received via mailing list)
You're right... but.... still....  I swear -- 'request[]' failed in
nitro/part/admin/og/controller.rb in OgAdminController::save

I'll try a very simple test case to verify -- perhaps some code included
via raw/model/webfile.rb is overriding it somehow...

The accessors do work as advertised in this case:

#!/usr/bin/env ruby
require 'nitro_and_og'
include Nitro


class Foo
  def index
     render_text "
       request() returns #{request.nil? ? 'nil' : request.class.name }
      <a href='/paramtest?a=b&c=d&foo=bar'>Parameters</a>
     "
  end
  def paramtest(*args)
    %{
        params=#{request.params}<br/>
        request[:foo] = #{request[:foo]}
     }
  end
end

app=Application.new
app.dispatcher.root = Foo
app.start
Posted by Robert Mela (Guest)
on 2007-10-01 18:03
Attachment: rob.vcf (117 Bytes)
(Received via mailing list)
Resending

With a fresh darcs get ( 30 minutes ago ) and this test program:

 #!/usr/bin/env ruby
 require 'ubygems'
 require 'sqlite3'
 require 'nitro_and_og'
 include Nitro
 require 'nitro/part/admin'

 # Og model
 class Book
   attr_accessor :title, String
   attr_accessor :author, String
 end

 # Controller
 class Foo
   def index
     render_text "Foo"
   end
 end

 Og.create_schema = true
 Og.use_uuid_primary_keys = true
 Og.start( :name => "library", :adapter => :sqlite, :evolve_schema =>
:full )

 app=Application.new
 app.dispatcher.root = Foo
 app.start

Saving a 'Book' produces this exception:

 ERROR: Error while handling OgAdminController#save()
 ERROR: undefined method `[]' for nil:NilClass

/Users/rmela/nitro2/repo.nitroproject.org/script/lib/../../raw/lib/raw/context/request.rb:304:in
`[]'

/Users/rmela/nitro2/repo.nitroproject.org/script/lib/../../nitro/lib/nitro/part/admin/og/controller.rb:93:in
`save'

Line 93 throws the exception:

    92   def save
    93     klass = name_to_class(request['object_class_name'].to_s)
    94
    95     if oid = request['oid']
    96       obj = klass[oid.to_s]
    97       obj.assign(request, :assign_relations => true,
:force_boolean => true)
    98     else
    99       obj = klass.new
   100       obj.assign(request, :assign_relations => true)
   101     end

I modified that slightly to produce some output:

    92   def save
    93     if request.nil?
    94        puts "OGADMIN request returns 'nil'"
    95     else
    96        puts "OGADMIN request() returns a #{request.class.name}"
    97        puts "OGADMIN request.params returns #{request.params ||
'nil'}"
    98        puts "OGADMIN request['oid'] returns #{request['oid']}"
    99     end


which produced this exception:

ERROR: undefined method `[]' for nil:NilClass
/Users/rmela/nitro/repo.nitroproject.org/script/lib/../../raw/lib/raw/context/request.rb:304:in
`[]'
/Users/rmela/nitro/repo.nitroproject.org/script/lib/../../nitro/lib/nitro/part/admin/og/controller.rb:98:in
`save'

And this output:

OGADMIN request() returns a Raw::Context
OGADMIN request.params returns nil
Posted by George Moschovitis (Guest)
on 2007-10-03 10:08
(Received via mailing list)
@post_params/@get_params are Dictionary objects. And I needed a version 
of
them as Hash.

Dictionary is not that compatible with Hash as someone would like.

-g.
Posted by George Moschovitis (Guest)
on 2007-10-03 10:09
(Received via mailing list)
>
> * request.params['foo']
> * request['foo']
>
> I use the second form all the time.
>

I use request["foo"] too...

btw you can also use:

request[:foo]

one more hidden 0.50.0 new feature?

-g.
Posted by Robert Mela (Guest)
on 2007-10-03 14:26
Attachment: rob.vcf (117 Bytes)
(Received via mailing list)
It's not working in OgAdminController.

Perhaps it's some interaction with WebFile...?

Try OgAdminController with this model (written from memory -- some
changes might be needed....)

In app.rb:

require 'raw/model/webfile'

Model:

class Asset
    attr_accessor :name, String
    attr_accessor :file, WebFile
end
This topic is locked and can not be replied to.