我是rails和编程的新手,我都转过身来了。我有用户创建的帖子,他们添加一个类别标签的帖子,类别标签是一个布尔属性的帖子模型,例如:音乐,:boolean,:default => false。
我希望用户有一个链接到"音乐",呈现一个新的页面,显示所有的帖子:音乐=>真。现在我了解了如何创建一个变量并运行一个帖子块,例如@music_posts = Post。where(:music => true)但我对如何制作路由/帖子/音乐感到困惑,我不确定我的defmusic_posts方法。
routes.rb
resources :posts do
member do
get :likers
end
collection do
get :search
end
end
resources :users do
member do
get :following, :followers, :likes
end
end
root :to => "pages#home"
类PagesController <程序控制器>程序控制器>
def home
@title = "Home"
@featured_posts = Post.featured.limit(10)
if user_signed_in?
@user = current_user
@post = current_user.posts.build
@feed_items = current_user.feed.paginate(:per_page => "10", :page => params[:page])
#render :layout => 'special_layout'
end
end
end
类PostsController <程序控制器>程序控制器>
before_filter :authenticate_user!, :only => [:create, :edit, :update, :destroy]
before_filter :authorized_user, :only => [:destroy, :edit, :update]
def create
@user = current_user
@post = current_user.posts.build
if @post.update_attributes(params[:post])
flash[:success] = "Post created!"
redirect_to root_path
else
@feed_items = current_user.feed.paginate(:per_page => "10", :page => params[:page])
render 'pages/home'
end
end
def index
@posts = Post.paginate(:page => params[:page])
end
end
end
def show
@post = Post.find(params[:id])
end
def edit
@post = Post.find(params[:id])
end
def update
@post = Post.find(params[:id])
respond_to do |format|
if @post.update_attributes(params[:post])
format.html { redirect_to(post_path(@post), :notice => 'Post was successfully updated.') }
else
format.html { render :action => "edit" }
end
end
end
def destroy
@post.destroy
redirect_to root_path
end
def likers
@title = "Likers"
@post = Post.find(params[:id])
@likers = @post.likers.paginate(:page => params[:page])
render 'show_likers'
end
def music_posts
@music_posts = Post.where(:music => true)
render 'show_music_posts'
end
private
def authorized_user
@post = Post.find(params[:id])
redirect_to root_path unless current_user?(@post.user)
end
end
编辑:尝试
路线enter code here
enter code here
match 'posts/categories/*tag' => 'posts#categories'
<<h2>文章控制器/h2>def categories
if params[:tag].present?
@posts = Post.where('#{params[:tag]} = ?', true).paginate(:page => params[:page])
end
render 'categories'
end
我需要一个自定义视图来显示它们,这一切都正确吗?
我假设您可能有比音乐更多的标签,如果没有,您可以通过硬编码音乐路由有一个更简单的方法。
我相信你想要的是路由Globbing,你可以在这里找到详细信息http://guides.rubyonrails.org/routing.html(只是去路由Globbing部分)。
基本上你会创建这样一个路由:
match 'posts/*tag' => 'posts#index'
这意味着任何像"…"/posts/something"将路由到你的索引方法在posts控制器,并将传递"东西"在参数[:tag]。然后,您可以检查params[:tag]是否存在,如果存在,则基于此过滤结果,否则显示所有结果。它将允许您只使用一个索引方法来覆盖所有场景。你的索引方法看起来像这样:
def index
if params[:tag].present?
@posts = Post.where('#{params[:tag]} = ?', true).paginate(:page => params[:page])
else
@posts = Post.paginate(:page => params[:page])
end
end
这样做可以让你有更多的标签,而不仅仅是音乐,并保持它的动态。
需要注意的一点是,在这个路由中,通配符将接受/posts/之后的任何内容,并将其作为参数传入,这可以覆盖你的其他路由,如new, create等。确保你按照正确的优先顺序正确地安排你的路线。更好的方法是设置route/posts/tags/music来避免这个问题。