RoR: все обернулось, пытаясь показать все сообщения с определенным атрибутом, это правда - PullRequest
1 голос
/ 06 октября 2011

Я новичок в рельсах и программировании в целом, и я все обернулся.У меня есть пользовательские записи, в которых они добавляют тег категории к сообщению, тег категории является логическим атрибутом модели сообщения, например: music,: boolean,: default => false.

Я бы хотел, чтобы у пользователя была ссылка на "Музыка", которая отображает новую страницу со всеми сообщениями, где: music => true.Теперь я понимаю, как создать переменную и выполнить блок постов, таких как @music_posts = Post.where (: music => true), но я запутался в том, как сделать маршрут / posts / music, и яне уверен насчет моего метода def music_posts.Любое объяснение помощи будет с благодарностью.

rout.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"

class 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

сопоставить 'posts / category / * tag' => 'posts # category'

контроллер сообщений

def categories
  if params[:tag].present?
    @posts  = Post.where('#{params[:tag]} = ?', true).paginate(:page => params[:page])
  end
  render 'categories'
end

Мне нужен пользовательский вид, чтобы показать их, это все правильно?

1 Ответ

1 голос
/ 06 октября 2011

Я предполагаю, что у вас может быть больше тегов, чем просто музыки, если нет, вы можете использовать более простой подход, жестко закодировав музыкальный маршрут.

Полагаю, вам нужен Route Globbing, подробности можно найти здесь http://guides.rubyonrails.org/routing.html (просто перейдите в раздел Route Globbing).

По сути, вы бы создали маршрут вроде:

match 'posts/*tag' => 'posts#index'

Это будет означать, что любой URL, такой как "... / posts /thing", будет перенаправлен на ваш метод индекса в контроллере сообщений и будет передавать "что-то" в виде params [: 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 и т. Д. Убедитесь, что вы правильно упорядочили свои маршруты за правильный приоритет. Еще лучше было бы сделать свой маршрут / посты / теги / музыку, чтобы избежать этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...