RoR:全部转过来,试图显示所有具有特定属性为true的帖子



我是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

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来避免这个问题。

最新更新