2016-07-07 6 views
0

prawn-rails gemを使用しようとしています。belongs_toモデルをループしようとしています

postyメソッドを正しく処理していないので、私はそれをすべて間違っていると知っていますか?同じことが、私は

# == Schema Information 
# 
# Table name: users 
# 
# id   :integer   not null, primary key 
# first_name :string 
# last_name :string 
# created_at :datetime   not null 
# updated_at :datetime   not null 
# 
require 'elasticsearch/model' 

class User < ActiveRecord::Base 
    searchkick word_start: [:user] 
    has_many :posts 
    validates :first_name, :last_name, presence: true 
end 

ポストモデルposty.pdf.prawn

ユーザーモデルで

# == Schema Information 
# 
# Table name: posts 
# 
# id   :integer   not null, primary key 
# title  :string 
# body  :string 
# date  :date 
# user_id :integer 
# created_at :datetime   not null 
# updated_at :datetime   not null 
# 

class Post < ActiveRecord::Base 
    belongs_to :user 
    validates :title, :body, presence: true 
    validates :title, length: { maximum: 140 } 
end 

ルートを持っているもののために行く

resources :users do 
    resources :posts 
    end 

prawn-railsの指示に従って、私はコントローラにメソッドを作成し、メソッドと同じ名前のビューを作成し、そのビューを記入することになっています。

投稿コントローラーのメソッド

def posty 
    @user = User.all 
    @post = @user.posts.find(params[:id]) 
    end 

posty.pdf.prawn

prawn_document do |pdf| 

    pdf.font_size 25 
    pdf.text 'List of Posts by User', :style => :bold 

    @post.each do |p| 
    pdf.font_size 16 
    pdf.text p.title 
    end 
end 

これがアップしますエラーです:(スクリーンショット)

enter image description here

EDIT

ルート

users_test GET /users/test(.:format)     users#test 
    posts_posty GET /posts/posty(.:format)     posts#posty 
      root GET /          users#index 
     search GET /search(.:format)      search#search 
    user_posts GET /users/:user_id/posts(.:format)   posts#index 
       POST /users/:user_id/posts(.:format)   posts#create 
new_user_post GET /users/:user_id/posts/new(.:format)  posts#new 
edit_user_post GET /users/:user_id/posts/:id/edit(.:format) posts#edit 
    user_post GET /users/:user_id/posts/:id(.:format)  posts#show 
       PATCH /users/:user_id/posts/:id(.:format)  posts#update 
       PUT /users/:user_id/posts/:id(.:format)  posts#update 
       DELETE /users/:user_id/posts/:id(.:format)  posts#destroy 
     users GET /users(.:format)       users#index 
       POST /users(.:format)       users#create 
     new_user GET /users/new(.:format)      users#new 
    edit_user GET /users/:id/edit(.:format)    users#edit 
      user GET /users/:id(.:format)      users#show 
       PATCH /users/:id(.:format)      users#update 
       PUT /users/:id(.:format)      users#update 
       DELETE /users/:id(.:format)      users#destroy 

EDIT 2

書き込みコントローラ

# == Schema Information 
# 
# Table name: posts 
# 
# id   :integer   not null, primary key 
# title  :string 
# body  :string 
# date  :date 
# user_id :integer 
# created_at :datetime   not null 
# updated_at :datetime   not null 
# 

class PostsController < ApplicationController 

    def posty 
    @posts = User.find(params[:user_id]).posts 
    end 

    def new 
    @user = User.find(params[:user_id]) 
    @post = @user.posts.new 
    end 

    def edit 
    @user = User.find(params[:user_id]) 
    @post = @user.posts.find(params[:id]) 
    render :edit 
    end 

    def create 
    @user = User.find(params[:user_id]) 
    @post = @user.posts.new(post_params) 
    if @post.save 
     redirect_to user_path(@post.user) 
    else 
     render :new 
    end 
    end 

    def update 
    @user = User.find(params[:user_id]) 
    @post = @user.posts.find(params[:id]) 
    if @post.update(post_params) 
     redirect_to user_path(@post.user) 
    else 
     render 'edit' 
    end 
    end 


    def destroy 
    @user = User.find(params[:user_id]) 
    @post = @user.posts.find(params[:id]) 
    @post.destroy 
     redirect_to users_path 
    end 


    private 
    def set_user 
    @user = User.find(params[:user_id]) 
    end 

    def set_post 
    @post = @user.find(params[:id]) 
    end 

    def post_params 
     params.require(:post).permit(:title, :body, :date) 
    end 
end 

ユーザーコントローラー

# == Schema Information 
# 
# Table name: users 
# 
# id   :integer   not null, primary key 
# first_name :string 
# last_name :string 
# created_at :datetime   not null 
# updated_at :datetime   not null 
# 

class UsersController < ApplicationController 
    def index 
    @users = User.page(params[:page]).per(10) 
    query = params[:query] 
    query = '*' if query.blank? 
    @users = User.search(query, page: params[:page]) 
    end 

    def test 
    @users = User.all 
    end 

    def show 
    @user = User.find(params[:id]) 
    end 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(user_params) 
    if @user.save 
     flash[:notice] = "User successfully added!" 
     redirect_to users_path 
    else 
     render :new 
    end 
    end 

    def edit 
    @user = User.find(params[:id]) 
    render :edit 
    end 

    def update 
    @user = User.find(params[:id]) 
    if @user.update(user_params) 
     redirect_to users_path 
    else 
     render :edit 
    end 
    end 

    def destroy 
    @user = User.find(params[:id]) 
    @user.destroy 
     redirect_to users_path 
    end 

    private 

    def user_params 
     params.require(:user).permit(:first_name, :last_name) 
    end 

end 

EDIT

enter image description here

EDITはAGAIN私が見

enter image description here

答えて

2

post belongs_to userをassosciationので、多くの記事を持っている一人のユーザーでなければなりません、この方法では、我々はポストの方法で使用する上記のリンクから

def posty 
    @user = User.find(params[:user_id]) 
    if @user.present? 
    @posts = @user.posts 
    end 
    end 

変更@postトンをUSER_IDを送信し、

<%= link_to "Download PDF", posts_posty_path(:format=>:pdf, :user_id => @user.id) %> 

する必要がありますので、 O @posts

はまた、これはあなたのために働くだろう

prawn_document do |pdf| 

    pdf.font_size 25 
    pdf.text 'List of Posts by User', :style => :bold 
    if @posts.present? 
    @posts.each do |p| 
     pdf.font_size 16 
     pdf.text p.title 
    end 
    end 
end 

、としてposty.pdf.prawnファイルに条件を追加します。

+0

良いニュースは、最終的に 'posty.pdf.prawn'に行き、投稿コントローラの' posty'メソッドの代わりにエラーを生成したということです。私は質問の一番下にスクリーンショットを含めました。 – user273072545345

+0

ポストコントローラ – Sravan

+0

から '@ post'の代わりに' @ posts'を送信しても、同じエラーが発生します。 – user273072545345

1

まあ1つの問題は、あなたのpでostyメソッド@user.posts.find(params[:id])は、@userインスタンス変数に1人のユーザーが存在することを前提としていますが、前の行ではを割り当てました。ユーザーは@userです。したがって、そのエラーメッセージが表示されます。

あなたのposty.pdf.prawnファイルは、eachイテレーターが動作するには、@postsにする必要があります。だからあなたのコントローラであなたはレンで@posts = @user.posts代わり

+0

を '@posts = @ user.posts'に変更しましたが、それでも同じエラーが表示されます。私の問題は、ユーザーに属する投稿をループする方法を理解できていないことです。それ、どうやったら出来るの? – user273072545345

+0

@userに1人のユーザーを正しく割り当てていないため、おそらくこのエラーが発生している可能性があります。 – Ren

+0

だから、 '@ user'は' User.find(params [:user_id]) 'でしょうか? – user273072545345

0

良いキャッチを持っている必要があります。 Post belongs_to :userUser has_many :postsの関係は、単一のユーザーのために機能します。 (User.allが返すものです。)ユーザーのない配列

あなたは、単一のユーザーを取得する必要があります。たとえば、@user = current_user(Deviseを使用している場合)。

+0

'でDeviseを使用していないユーザーを見つけることができませんでした。 – user273072545345

0

指定されたネストされたリソースによって、ユーザーリソースを指すuser_idがあります。 rake routesを使用すると、リソースルートでどのようなパラメータが慣習によって与えられているかを知ることができます。あなたの投稿#indexアクションでは、ユーザを取得してから、@posts = User.find(params[:user_id]).postsのような投稿に問い合わせる必要があります。あなたは、ネストされたリソースのすべての中で、この特定のユーザーが必要になります、あなたは、アクションの前に書きたいことのように...あなたによると

class PostsController < ApplicationController 

    before_action :set_user 
    before_action :set_post, only: [:show, :edit, :update, :destroy] 

    # ... the bacon 

    private 

    def set_user 
    @user = User.find(params[:user_id]) 
    end 

    def set_post 
    @post = @user.find(params[:id]) 
    end 
end 
+0

質問するルートを追加しました。また、...これを持っていることをお勧めします: '@posts = User.find(params [:user_id])。posts'は私のpostyメソッドにありますか? 'set_user'と' set_post'を持っていますか? – user273072545345

+0

このエラーが発生しました: '' id '=' – user273072545345

+0

'のユーザーを見つけることができませんでした。 '/ users/1/posts'のようなもの? id = 1のユーザーがいることを確認しましたか? – unused

関連する問題