Radiant extension and rails method

Hi all,

I’m pretty new in radiant and in ruby on rails but I’m making an
extension for radiant and I have some questions I’m pretty sure you’ll
be able to answer:

I’m creating my tags for my extension in app/models/solr_tags.rb

I’m using the method session of the
ActionController::SessionManagement::ClassMethods class of rails but to
use this session method I had to add this in my solr_tags.rb file:

include ActionController::SessionManagement::ClassMethods

After that I can call the method session in my
lib/flare/controller_extensions.rb that is in a function I’m calling
from my solr_tags.rb file.

But now, I have this error: undefined method `write_inheritable_array’
that I could solve doing an other include of a rails class but I was
wondering if there is an other way to get all these rails method without
adding an include each time I need one rails method. Furthermore, it’s
the method session that is using write_inheritable_array so it should be
fine. I think I have some misconfiguration somewhere. Can you help?

Hope I was clear enough, tell me if not and thank you in advance for
your help.

Marc

Marc,

By default, Radius tags are rendered within a Page that is called from
the SiteController, which has the session turned off. You might be
better off using cookies, but you would only be able to read them unless
you can come up with some scheme that decides what cookies to send based
on the page. Including that module doesn’t accomplish what you want.
Could you give us a little more detail about what you want to do?

Sean

I think a piece of code will explain better what I want to do:

Here is my solr_tags.rb:

module SolrTags
include Radiant::Taggable
include Flare::ActionControllerExtensions::InstanceMethods
include ActionController::SessionManagement::ClassMethods

...

tag 'solr:facet_list' do |tag|
    @flare = flare_before
    @flare.facet_fields.each do |field|
        %{#{facet_label(field)}}
    end
end

end

The flare_before function in lib/flare/controller_extensions.rb

def flare_before
# TODO: allow source of context to be configurable.
session[:flare_context] ||= Flare::Context.new(SOLR_CONFIG)

      @flare = session[:flare_context]

  return @flare

end

The method session is part of rails, I can call it thanks to include
ActionController::SessionManagement::ClassMethods.

Now I have this error message:
undefined method `write_inheritable_array’

This method is called by the method session of rails.

What I want to do is that I don’t have to add include
ActionController::SessionManagement::ClassMethods and that when I use a
rails method, this method knows about others rails method.

In short, I want to have access to every rails method.

Marc

I had to do this i would find a way to refer to the active controller,
in this case SiteController, and execute my “rails” methods on that
object.
Or even do some ugly meta-programming stuff so in your tags “self”
refers to
that controller object.

There must be an instance or class variable that you can access that

gives you a reference to that SiteController instance. Do something
like
“puts self.inspect” in your tag to see your “environment” and search for
something useful.

/AITOR

I just add something to my previous message:

Today I have to do this to call the session method of rails (or any
other rails method):
ActionController::SessionManagement::ClassMethods.session

I want to have to do:
session

without writing the ActionController::SessionManagement::ClassMethods or
doing an include ActionController::SessionManagement::ClassMethods

Marc

Thank you for your answer. Here is what I’ve done. I installed the
plugin radiant-rails-support that you can find here:
http://code.google.com/p/radiant-rails-support/

Now I’ve access to rails method doing this in my app/models/solr_tags.rb
(class SolrClass < SiteController):

module SolrTags
include Radiant::Taggable

class SolrClass < SiteController
def getflare
session[:flare_context] ||= Flare::Context.new(SOLR_CONFIG)
@flare = session[:flare_context]
end
end

tag ‘solr’ do |tag|
tag.expand
end

tag ‘solr:facet_list’ do |tag|
s = SolrClass.new
s.getflare
end
end

The problem is that the behaving of this doesn’t seem the same than if I
do this in app/view/index.rhtml for example and I was wondering if
someone could explain me why because I am lost.

I get this error when I’m calling the tag solr_facet_list
(<r:solr:facet_list></r:solr:facet_list>):
You have a nil object when you didn’t expect it! You might have expected
an instance of Array. The error occurred while evaluating nil.[]

Marc

When you do “s = SolrClass.new” you are creating a new controller
instance that has nothing to do with the current request. So seems that
the
“session” in “session[:flare_context]” is nil. This is totally normal.

The "class SolrClass < SiteController" doesn't do what you expect.

Search this list for “session activation” or something similar, i
remember
that in the past someone asked this and finally was able to activate
them.
His solution could be the door to what you are looking for.

/AITOR