试图遍历belongs_to模型

时间:2016-07-07 04:55:30

标签: ruby-on-rails ruby prawn

尝试使用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 

这是出现的错误:(截图)

enter image description here

修改

路线

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

修改

enter image description here

再次编辑

enter image description here

4 个答案:

答案 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 :userUser 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