如何从用户上传制作可点击的pdf?

时间:2014-07-14 13:13:34

标签: ruby-on-rails ruby pdf download pdf-generation

我正在制作一个餐馆应用程序,我无法让用户上传菜单的PDF,同时能够点击下载我的索引和显示页面。这是我的index.html.erb上的表格:

<tbody >
    <% @restaurants.each do |restaurant| %>
    <tr>
        <td><%= restaurant.name %></td>
        <td><%= restaurant.description %></td>
        <td><%= restaurant.phone_number %></td>
        <td><%= restaurant.address %></td>
        <td><%= image_tag(restaurant.picture_url, :width => 300) if restaurant.picture.present? %> </td>
        <td><%= link_to(restaurant.menu) if restaurant.menu.present? %> </td>

        <td><%= link_to 'Show', restaurant %></td>
        <td><%= link_to 'Edit', edit_restaurant_path(restaurant) %></td>
        <td><%= link_to 'Destroy', restaurant, method: :delete, data: { confirm: 'Are you sure?' } %></td>
    </tr>
    <% end %>
</tbody>

以下是展示页面的相关代码:

<p>
    <strong>Look at the Menu:<strong>
    <%= link_to(@restaurant.menu) if @restaurant.menu.present? %>

</p>

另外,控制器是否也需要更新?

更新了控制器:

class RestaurantsController < ApplicationController 
     before_action :set_restaurant, only: [:show, :edit, :update, :destroy]



def index
    @restaurants=Restaurant.all
end

def show
end

def new
    @restaurant = Restaurant.new 
end

def edit
end

def create
    @restaurant = Restaurant.new(restaurant_params)

    respond_to do |format|
        if @restaurant.save
            format.html {redirect_to @restaurant, notice: 'Restaurant was successfully created.'}
            format.json { render :show, status: :created, location: @restaurant}
        else
            format.html {render :new }
            format.json {render json: @restaurant.errors, status: :unprocessable_entity }
        end
    end
end


def update
    respond_to do |format|
        if @restaurant.update(restaurant_params)
        format.html { redirect_to @restaurant, notice: 'Restaurant was successfuly updated.'}
        format.json { redner :show, status: :ok, location: @restaurant }
        else 
        format.html { render :edit }
        format.json { render json: @restaurant.errors, status: :unprocessable_entity}
        end
    end
end


def destroy 
    @restaurant.destroy
    respond_to do |format|
        format.html { redirect_to restaurants_url, notice: 'Restaurant was destorys.'}
        format.json { head :no_content }
    end
end




private

def set_restaurant
    @restaurant = Restaurant.find(params[:id])
end




def restaurant_params
    params.require(:restaurant).permit(:name, :description, :address, :phone_number, :picture, :menu)
end


end

路线:

Rails.application.routes.draw do
  resources :restaurants

root :to => redirect('/restaurants')

1 个答案:

答案 0 :(得分:0)

您需要做更多工作才能使文件上传工作。请阅读corresponding Rails guide,告诉您上传字段将为您提供IO对象。这不是您的通用属性,您必须以其他方式处理它(例如,通过使用paperclip gem)。您上传的文件只是通过控制器中的saveupdate来电存储,您必须为此添加一些代码,但paperclip会做大部分的努力。

此外,您必须提供更多逻辑来显示菜单链接,因为必须通过其他操作提供,您必须提供单独的路径来处理文件。通常,您不希望将内部存储的文件名公开给用户,它应该只存储在您的模型中。由于我自己没有使用paperclip来做这件事,我很难告诉你,但docs on github会让你走得很远。它提供了有关如何为数据库指定附件,如何配置文件存储等的其他信息。您还可以参考this question获取有关如何上传PDF并提供PDF链接的示例。添加rake routes gem之后,请务必查看paperclip,我相信它会添加一些路由来检索您的文件。