尝试使用prawn-rails
gem。
我知道我所做的window.location
方法都错了,因为我没有正确地循环它,是吗?同样适用于posty
用户模型
posty.pdf.prawn
发布模型
# == 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
路由
# == 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
根据prawn-rails的方向,我应该在控制器中创建方法,创建一个与方法同名的视图,并填写该视图。
帖子控制器中的方法
resources :users do
resources :posts
end
posty.pdf.prawn
def posty
@user = User.all
@post = @user.posts.find(params[:id])
end
这是出现的错误:(截图)
修改
路线
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
编辑2
帖子控制器
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
用户控制器
# == 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
修改
再次编辑
答案 0 :(得分:2)
根据你的assosciation post belongs_to user
,所以它应该是一个有很多帖子的用户,所以方法应该是,
<%= link_to "Download PDF", posts_posty_path(:format=>:pdf, :user_id => @user.id) %>
从上面的链接发送user_id,我们将在posts方法中使用
def posty
@user = User.find(params[:user_id])
if @user.present?
@posts = @user.posts
end
end
将@post
更改为@posts
另请在posty.pdf.prawn文件中添加条件,
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
这对你有用。
答案 1 :(得分:1)
我看到的一个问题是,在您的posty方法中@user.posts.find(params[:id])
期望@user
实例变量中只有一个用户,但在上一行中您指定了全部用户@user
。因此,您收到了该错误消息。
然后在你的posty.pdf.prawn文件中@post
应@posts
each
迭代器才能工作。因此,在您的控制器中,您应该@posts = @user.posts
而不是
答案 2 :(得分:0)
Ren很好的捕获。 Post belongs_to :user
和User has_many :posts
关系适用于单个用户。不是一组用户(User.all
将返回。)
您需要抓住一个用户。例如,通过@user = current_user
(如果使用Devise)。
答案 3 :(得分:0)
根据您给定的嵌套资源,您有一个指向您的用户资源的user_id。使用rake routes
可以了解资源路径中按惯例给出的参数。因此,在您的帖子#index action中,您必须获取用户,然后查询@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