Forum: RForum RForum from sub-directory

Posted by Benjamin Arai (benjamin)
on 2006-06-19 03:53
How do I get RForum running from a sub-directory (/forum)?  I thought I 
could just change the Rewritebase to /forum but that doesn't work. 
Thanks in advance.
Posted by Andrew Hodgkinson (pond)
on 2006-07-07 11:53
Benjamin Arai wrote:

> How do I get RForum running from a sub-directory (/forum)?  I thought I 
> could just change the Rewritebase to /forum but that doesn't work. 
> Thanks in advance.

The changes you need to make are extensive, because RForum has a number 
of places where it hard-codes URLs thereby igoring any sub-directory 
that you specify.

The basics for any Rails application are onerous enough:

(1) Edit config/routes.rb and add the subdirectory to the paths in the
    various map.connect lines - e.g.:

      map.connect '', :controller => 'forum', :action => 'list'

    ...becomes:

      map.connect '/forum', :controller => 'forum', :action => 'list'

    You might want to do it using a variable instead (e.g. PATH_PREFIX) 
set
    up in one of the environment files, in case you ever want to move 
the
    forum or make a copy of your installation on a different server 
under a
    different subdirectory.

      map.connect PATH_PREFIX + '', :controller => 'forum', :action => 
'list'

(2) Tell the Helper URLs that you're not running from root. You do this 
by
    hijacking the "asset host" stuff, so that images, scripts, CSS etc. 
are
    fetched from a different location. This only works for places where 
a
    helper method has been called to generate a URL, so all Rails apps 
should
    do this for all URLs, but many don't and RForum is a good (bad?) 
example.

    Somewhere within the "Rails::initializer.run do |config|" block of
    config/environment.rb, add:

      config.action_controller.asset_host = "/forum"

    Now whether or not "/forum" works will depend on whether a path such 
as
    "/forum/images/something.png" would work OK on your host. That will 
in
    turn depend on where the Rails application's "public" folder lives. 
So
    modify the line above in order to generate correct links for 
wherever
    your Web server will go for items in the RForum "public" folder.

(3) If you run RForum out of a subdirectory the implication is that you 
may
    want to run multiple Rails applications on one host. If you do this, 
the
    name of the session cookies used by each will clash. To avoid this, 
give
    the cookie a unique name. In config/environment.rb or in one of the 
files
    in config/environments, add the following line *outside* the
    "Rails::initializer.run do |config|" block:

      ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS[:session_key]
      = 'rforumapp_session_id'

    You can use whatever name you want, it doesn't have to be
    "rforumapp_session_id".

For many Rails applications, that's enough. There may be the odd rogue 
hard-coded URL to sort out. For RForum, there are loads of them. Check 
the skin CSS files - CSS is a weakness for Rails, because you can't use 
ERB in CSS files so URLs to images and so-on *must* be hard-coded. If 
you're using a skin that references images you may, depending on where 
you've put "public", need to change the URLs in the CSS files.

You're going to have to do some work with things making calls to any 
method in the Mailer class (app/controllers/mailer.rb) because most 
methods take a URL to include in a notification e-mail message. For some 
reason in several places RForum callers construct URLs "by hand" using 
@request.host and so-on. You need to change those into equivalent 
"url_for" calls, e.g. in places like app/controllers/user_controller.rb 
where it's calling deliver_registration_mail.

You will similarly need to look in the various app/views fragments to 
check for hard-coded URLs there; it's been a while since I looked at 
those since they were the first things I changed but ISTR similar issues 
with URLs written into the RHTML where helper method calls should have 
been. There were a couple of more tricky cases that I may have 
temporarily just hard-coded to my own subdirectory in lieu of a proper 
fix at a later time.

Incidentally, if you're using PostgreSQL not MySQL you'll find searches 
don't work because RForum uses a "LIMIT x,y" query form which PostgreSQL 
doesn't understand. In app/models/search_like.rb, change "LIMIT ?,?" to 
"OFFSET ? LIMIT ?" to get what ought to be identical functionality 
that'll work in either database.

Doing all of this is a pain, which is why I'm offering to put these 
fixes into the tree. For free, out of the goodness of my heart :-) - 
except the authors haven't responded to e-mail and nobody on this forum, 
yet, has suggested where I should be going to submit such patches, and 
all my IRC pleas to date have fallen on deaf ears. So I've a (almost 
completely) relocatable version of RForum but nobody else can use it 
right now. Doh. Can anyone help?
Posted by Andrew Hodgkinson (pond)
on 2006-07-07 11:54
I wrote:

> (1) Edit [...]

Grrr. Sorry about the formatting. It seems the text area width is not 
accurately representative of the hard-wrap width set within RForum.
Posted by S. Potter (mbbx6spp)
on 2007-01-26 04:04
Benjamin,

I have the "patch" for the 2nd proposal by Andrew above.  The following 
is my attempt at fixing the code such that it doesn't break 
installations that (a) are at the host root; and (b) also works for 
people like you and I that installed RForum under a host subdirectory:

{
hunk ./app/helpers/application_helper.rb 103
-    '<img src="/captcha/image?' + rand.to_s + '" />'
+    image_tag "/captcha/image?#{rand.to_s}", :alt => "Captcha Image"
hunk ./app/models/post.rb 68
-    Post.find(:all, :conditions => "deleted = 0", 'created_at DESC, id 
DESC', :limit => number)
+    Post.find(:all, :conditions => ["deleted = 0", 'created_at DESC, id 
DESC'], :limit => number)
hunk ./app/views/layouts/default.rhtml 8
-  <link type="text/css" rel="stylesheet" href="/stylesheets/main.css" 
/>
-  <!-- syntax highlighting -->
-  <link type="text/css" rel="stylesheet" href="/stylesheets/syntax.css" 
/>
-  <link type="text/css" rel="stylesheet" media="print" 
href="/stylesheets/print.css" />
+  <%= stylesheet_link_tag 'main' -%>
+  <%= stylesheet_link_tag 'syntax' -%>
+  <%= stylesheet_link_tag 'print', :media => 'print' -%>
+  <%= javascript_include_tag 'highlightCurrentLink' -%>
+  <%= javascript_include_tag 'findpos' -%>
hunk ./app/views/layouts/default.rhtml 14
-  <script src="/javascripts/highlightCurrentLink.js" 
type="text/javascript"></script>
-  <script src="/javascripts/findpos.js" 
type="text/javascript"></script>
-  $
hunk ./app/views/layouts/default.rhtml 15
-    <link type="text/css" rel="stylesheet" media="screen" 
href="/skins/<%= h @skin %>/style.css" />
+    <%= stylesheet_link_tag "/skins/#{@skin}/style", :media => 'screen' 
-%>
}

Since this is an inclusive solution that doesn't break one side or the 
other, I suggest it gets submitted to the darcs RForum codebase - any 
ideas how I should go about doing this?

Also if you haven't already I suggest you add the following to the end 
of your config/environment.rb added a similar fix (perhaps you are using 
the horrible reverse_proxy plugin?  The following is specific to those 
wishing to run RForum from a subdirectory rather than the host root (and 
in my opinion is cleaner than the reverse_proxy plugin code):
+module ActionController
+  protected
+    BASE_URL = "http://HOSTNAME/SUBDIR"
+    ActionController::Base.asset_host = BASE_URL
+
+    class UrlRewriter
+      alias old_rewrite_url rewrite_url
+      # Prepends the BASE_URL to all of the URL requests created by the 
$
+      # URL rewriter in Rails.
+      def rewrite_url(path, options)
+        url = old_rewrite_url(path, options)
+        unless options[:skip_relative_url_root]
+          url = url.gsub(@request.protocol + @request.host_with_port, 
'')
+          url = BASE_URL + url
+        end
+        url
+      end
+    end
+end

Now I just have to figure out the problem I am having with RForum not 
reading my site.rb preference for the skin and I should be all set....:)

Hope this helps,
SP
Posted by S. Potter (mbbx6spp)
on 2007-01-26 16:40
> Since this is an inclusive solution that doesn't break one side or the 
> other, I suggest it gets submitted to the darcs RForum codebase - any 
> ideas how I should go about doing this?
To respond to myself, since I wasn't sure about the protocol on this, I 
sent the darcs patch over to Andreas via email (using darcs and 
surprised how nice darcs is to use) and hoped this was the right (and 
not too rude) way of doing this.  Apologies if this is not the right 
way.  I would be happy to submit it another way.

Thanks,
SP
Posted by Andreas S. (andreas)
on 2007-01-26 21:21
Hi,

I didn't receive your patch. What address did you send it to?

Andreas
Posted by S. Potter (mbbx6spp)
on 2007-02-06 21:37
Andreas Schwarz wrote:
> I didn't receive your patch. What address did you send it to?
For others following this thread, Andreas and I email each other off the 
forum and about 10 days ago Andreas committing my patch to fix this 
issue.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.