current_user и Комментарии к сообщениям - Создать другую ассоциацию или цикл сообщений? - Рубин на рельсах - PullRequest
0 голосов
/ 30 апреля 2010

Я создал приложение для блога с использованием Ruby on Rails и только что добавил элемент аутентификации, и он работает хорошо. Сейчас я пытаюсь вернуться через свое приложение, чтобы настроить код так, чтобы он отображал только информацию, связанную с определенным пользователем.

В настоящее время пользователи has_many :posts и Posts has_many :comments.

Когда сообщение создано, я успешно вставляю user_id в таблицу сообщений. Кроме того, я успешно отображаю только сообщения, принадлежащие определенному пользователю, при входе в систему в /views/posts/index.html.erb представлении. Моя проблема с комментариями.

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

Нужно ли создавать ассоциации, чтобы комментарии также принадлежали пользователю? Или есть способ настроить мой код, чтобы просто перебрать пост для отображения этих данных.

Я поместил код для PostsController, CommentsController и /posts/index.html.erb ниже, а также мой код представления, но опубликую больше, если необходимо.

class PostsController < ApplicationController

  before_filter :authenticate

  auto_complete_for :tag, :tag_name
  auto_complete_for :ugtag, :ugctag_name

  def index
    @tag_counts = Tag.count(:group => :tag_name, 
       :order => 'count_all DESC', :limit => 20)
       conditions, joins = {}, :votes

    @ugtag_counts = Ugtag.count(:group => :ugctag_name, 
       :order => 'count_all DESC', :limit => 20)
       conditions, joins = {}, :votes

    @vote_counts = Vote.count(:group => :post_title, 
          :order => 'count_all DESC', :limit => 20)
          conditions, joins = {}, :votes


       unless(params[:tag_name] || "").empty?
         conditions = ["tags.tag_name = ? ", params[:tag_name]]
         joins = [:tags, :votes]
       end
       @posts= current_user.posts.paginate(
                 :select => "posts.*, count(*) as vote_total", 
                 :joins => joins, 
                 :conditions=> conditions, 
                 :group => "votes.post_id, posts.id ", 
                 :order => "created_at DESC",
                 :page => params[:page], :per_page => 5)
        @popular_posts=Post.paginate(
                 :select => "posts.*, count(*) as vote_total", 
                 :joins => joins, 
                 :conditions=> conditions, 
                 :group => "votes.post_id, posts.id", 
                 :order => "vote_total DESC",
                 :page => params[:page], :per_page => 3)

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @posts }
      format.json { render :json => @posts }
      format.atom
    end
  end

  def show
    @post = Post.find(params[:id])


    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @post }
    end
  end

  def new
    @post = Post.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @post }
    end
  end

  def edit
    @post = Post.find(params[:id])
  end

  def create
    @post = current_user.posts.create(params[:post])

    respond_to do |format|
      if @post.save
        flash[:notice] = 'Post was successfully created.'
        format.html { redirect_to(@post) }
        format.xml  { render :xml => @post, :status => :created, :location => @post }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @post.errors, :status => :unprocessable_entity }
      end
    end
  end

  def update
    @post = Post.find(params[:id])

    respond_to do |format|
      if @post.update_attributes(params[:post])
        flash[:notice] = 'Post was successfully updated.'
        format.html { redirect_to(@post) }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @post.errors, :status => :unprocessable_entity }
      end
    end
  end


  def destroy
    @post = Post.find(params[:id])
    @post.destroy


    respond_to do |format|
      format.html { redirect_to(posts_url) }
      format.xml  { head :ok }
    end
  end
end

CommentsController

class CommentsController < ApplicationController

  before_filter :authenticate, :except => [:show, :create]

  def index

    @comments = Comment.find(:all, :include => :post, :order => "created_at DESC").paginate :page => params[:page], :per_page => 5

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @comments }
      format.json { render :json => @comments }
      format.atom
    end
  end

  def show
     @comment = Comment.find(params[:id])

     respond_to do |format|
       format.html # show.html.erb
       format.xml  { render :xml => @comment }
     end
   end

   # GET /posts/new
   # GET /posts/new.xml

   # GET /posts/1/edit
   def edit
     @comment = Comment.find(params[:id])
   end

   def update
     @comment = Comment.find(params[:id])

     respond_to do |format|
       if @comment.update_attributes(params[:comment])
         flash[:notice] = 'Comment was successfully updated.'
         format.html { redirect_to(@comment) }
         format.xml  { head :ok }
       else
         format.html { render :action => "edit" }
         format.xml  { render :xml => @comment.errors, :status => :unprocessable_entity }
       end
     end
   end


 def create
   @post = Post.find(params[:post_id])
   @comment = @post.comments.build(params[:comment])

   respond_to do |format|
     if @comment.save
       flash[:notice] = "Thanks for adding this comment" 
       format.html { redirect_to @post }
       format.js
     else
       flash[:notice] = "Make sure you include your name and a valid email address" 
       format.html { redirect_to @post }


   end
 end
end 







 def destroy
    @comment = Comment.find(params[:id])
    @comment.destroy



    respond_to do |format|
      format.html { redirect_to Post.find(params[:post_id]) }
      format.js

    end
  end

end

Просмотр кода для комментариев

<% Comment.find(:all, :order => 'created_at DESC', :limit => 3).each do |comment| -%>
                <div id="side-bar-comments">
                    <p>
                        <div class="small"><%=h comment.name %> commented on:</div>
                        <div class="dark-grey"><%= link_to h(comment.post.title), comment.post %><br/></div>
                        <i><%=h truncate(comment.body, :length => 100) %></i><br/>
                        <div class="small"><i> <%= time_ago_in_words(comment.created_at) %> ago</i></div>
                    </p>
                </div>
            <% end -%>

Ответы [ 2 ]

1 голос
/ 30 апреля 2010

Во-первых, не связывайтесь с MVC. Линия:

Comment.find(:all, :order => 'created_at DESC', :limit => 3)

должно быть в контроллере:

@comments = Comment.find(:all, :order => 'created_at DESC', :limit => 3)

и в поле зрения:

<% @comments.each do |comment| %>

Или даже лучше с частями:

<%= render :partial => "comment_item", :collection => @comments %>

Он будет повторяться по всем @comments.

Далее, если вы хотите отобразить все комментарии, назначенные посту, то для отношения постов has_many comments достаточно. Используйте это так:

# controller
@posts = current_user.posts(:include => :comments)

# view
<% @posts.each do |post| %>
  <%=h post.title %> - Comments: <br />
  <% post.comments.each do |comment| %>
    <%=h comment.body %>
  <% end %>
<% end %> 

Если вы хотите показывать только комментарии, опубликованные current_user, тогда все ваши комментарии должны быть заполнены user_id. И используйте его так же, как вы показываете сообщения пользователей.

1 голос
/ 30 апреля 2010

Я считаю, что вы можете установить другое отношение на user модели

has_many :comments, :through => :posts

, а затем пользователь @user.comments.

...