7

Rails で投稿とユーザーを含む独自のブログを作成しています。特定の著者をクリックしたときに、その著者からのすべての投稿を表示する必要があります (ここではコンセプト:リンク)。これにはどうすればよいですか?追加情報またはコードを教えてください

ユーザーコントローラー:

class UsersController < ApplicationController
def show
@user = User.find(params[:id])
@posts = @user.posts
  end

end

投稿コントローラー:

class PostsController < ApplicationController
before_filter :authenticate_user!, :except => [:show, :index]

# GET /posts
# GET /posts.json



def index
 @posts = Post.all

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

# GET /posts/1
# GET /posts/1.json
def show
@post = Post.find(params[:id])

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

# GET /posts/new
# GET /posts/new.json
def new
 @post = Post.new

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

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

 # POST /posts
# POST /posts.json
 def create
#@post = Post.new(params[:post])
@post = current_user.posts.build(params[:post])
respond_to do |format|
  if @post.save
    format.html { redirect_to @post, notice: 'Post was successfully created.' }
    format.json { render json: @post, status: :created, location: @post }
  else
    format.html { render action: "new" }
    format.json { render json: @post.errors, status: :unprocessable_entity }
    end
  end
 end

# PUT /posts/1
# PUT /posts/1.json
def update
 @post = Post.find(params[:id])

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

# DELETE /posts/1
# DELETE /posts/1.json
def destroy
@post = Post.find(params[:id])
@post.destroy

 respond_to do |format|
  format.html { redirect_to posts_url }
  format.json { head :no_content }
  end
 end
end

ユーザーモデル:

class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable,
# :lockable, :timeoutable and :omniauthable
has_many :posts, :dependent => :destroy
validates :fullname,      :presence => true, :uniqueness => true
validates :password,      :presence => true
validates :email,         :presence => true, :uniqueness => true


devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

attr_accessible :email, :password, :password_confirmation, :fullname


end

ポストモデル:

class Post < ActiveRecord::Base
attr_accessible :text, :title

validates :user_id, :presence => true
validates :title,   :presence => true
validates :text, :presence => true

belongs_to :user
has_many :comments
end
4

2 に答える 2

1

User と Post の 2 つのモデルが必要です。それらの間には関係があります:ユーザーは多くの投稿を持っています、投稿はユーザーに属しています。データベースでこの関係を作成するには、user_id 列を posts テーブルに追加する必要があります。これを行うには、次のコマンドを実行します。

rails generate migration AddUserIdToPosts user_id: integer

その後 rake db:migrate を実行することを忘れないでください

モデル間の関連付けを作成するには、User モデルに追加します。

has_many :posts, dependent: :destroy

モデルを投稿するには:

belongs_to :user

これで、投稿で 'user' メソッドを使用し、ユーザーで 'posts' メソッドを使用できるようになりました。たとえば、users コントローラの show アクションでは次のようになります。

@user = User.find(params[:id])
@posts = @user.posts

このリンクが役に立ちます: http://guides.rubyonrails.org/association_basics.html http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

于 2013-07-28T18:57:33.193 に答える