开发者

Inserting variable into routes - map.resources :posts, :as => X - is this possible?

Ok, so I am working on a blog application of sorts. Thus far, it allows for a user to sign up for their own account, create posts, tags, comments, etc.

I have just implemented the ability to use www.myapp.com/brandon to set @user to find by username and therefore correctly display the users information at each url. So when you go to www.myapp.com/brandon you see all Brandon's posts, tags, and comments associated with those posts, etc. Works great.

I'm implementing this URL mapping through the routes.rb file by adding the following:

map.username_link '/:username', :controller => 'posts', :action => 'index'

And then just setting the @user variable in the PostController and corresponding views to find_by_username. Now the issue is this. Once at www.myapp.co开发者_如何转开发m/brandon when you click on a post title, it sends to myapp.com/posts/id without the username in the URL.

How do I tell rails to replace the /posts with /username.

Is it even possible to insert the user_username variable into this code?

map.resources :posts, :as => [what goes here] 


You said there's going to be more than just posts on the page? comments and tags too? Sounds like we need some resource aggregation here...

Another concern: what if a user picks the name faq and you want domain.com/faq down the road? You can't possibly know all the URLs you will want in the future. Prefixing paths with /profiles is a great way to build a little "namespace" to prevent this from happening. So...

Why not a ProfilesController?

script/generate controller profiles index show

routes.rb

ActionController::Routing::Routes.draw do |map|

  map.resources :profiles,        :only => [:index, :show] do |profile|
    profile.resources :posts,     :only => [:index, :show]
    profile.resources :comments,  :only => [:index, :show]
    profile.resources :tags,      :only => [:index, :show]
  end

  # ...
end

This will give you the following routes

        profiles GET /profiles(.:format)                          {:controller=>"profiles", :action=>"index"}
         profile GET /profiles/:id(.:format)                      {:controller=>"profiles", :action=>"show"}
   profile_posts GET /profiles/:profile_id/posts(.:format)        {:controller=>"posts", :action=>"index"}
    profile_post GET /profiles/:profile_id/posts/:id(.:format)    {:controller=>"posts", :action=>"show"}
profile_comments GET /profiles/:profile_id/comments(.:format)     {:controller=>"comments", :action=>"index"}
 profile_comment GET /profiles/:profile_id/comments/:id(.:format) {:controller=>"comments", :action=>"show"}
    profile_tags GET /profiles/:profile_id/tags(.:format)         {:controller=>"tags", :action=>"index"}
     profile_tag GET /profiles/:profile_id/tags/:id(.:format)     {:controller=>"tags", :action=>"show"}

profiles_controller.rb

class ProfilesController < ApplicationController

  # show all profiles; profile browser
  # /profiles
  def index
  end

  # show one profile
  # /profiles/:id
  def show
    @user = User.find_by_username(params[:id])
  end

end

posts_controller.rb (and others)

class PostsController < ApplicationController

  before_filter :find_profile, :only => [:index, :show]

  # list all posts for this profile
  # /profiles/:profile_id/posts
  def index
  end

  # show one post for this profile
  # /profiles/:profile_id/posts/:id
  def show
  end

  protected 

    def find_profile
      @user = User.find_by_username(params[:profile_id])
    end

end


You should be able to create the link using:

= link_to "User Posts", subdomain_link_url(@user.username, @post)

In your PostController, then, I would use a before_filter to lookup and set the @user variable:

class PostController < ApplicationController
  before_filter :find_user

  def other_method
    # Some code here
  end

protected
  def find_user
    @user = User.find_by_username(params[:username])
  end
end


I don't know much about routes and stuff, so forgive me if this doesn't make sense, but doesn't it works for you?

map.resources :posts, :path_prefix => '/:username' do |post|
    post.resources :comments
end

I can see here that this will generate the following

            posts GET    /:username/posts(.:format)                            {:controller=>"posts", :action=>"index"}
                  POST   /:username/posts(.:format)                            {:controller=>"posts", :action=>"create"}
         new_post GET    /:username/posts/new(.:format)                        {:controller=>"posts", :action=>"new"}
        edit_post GET    /:username/posts/:id/edit(.:format)                   {:controller=>"posts", :action=>"edit"}
             post GET    /:username/posts/:id(.:format)                        {:controller=>"posts", :action=>"show"}
                  PUT    /:username/posts/:id(.:format)                        {:controller=>"posts", :action=>"update"}
                  DELETE /:username/posts/:id(.:format)                        {:controller=>"posts", :action=>"destroy"}
    post_comments GET    /:username/posts/:post_id/comments(.:format)          {:controller=>"comments", :action=>"index"}
                  POST   /:username/posts/:post_id/comments(.:format)          {:controller=>"comments", :action=>"create"}
 new_post_comment GET    /:username/posts/:post_id/comments/new(.:format)      {:controller=>"comments", :action=>"new"}
edit_post_comment GET    /:username/posts/:post_id/comments/:id/edit(.:format) {:controller=>"comments", :action=>"edit"}
     post_comment GET    /:username/posts/:post_id/comments/:id(.:format)      {:controller=>"comments", :action=>"show"}
                  PUT    /:username/posts/:post_id/comments/:id(.:format)      {:controller=>"comments", :action=>"update"}
                  DELETE /:username/posts/:post_id/comments/:id(.:format)      {:controller=>"comments", :action=>"destroy"}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜