您可能需要網站訪問者在伺服器上上載文件。Rails使得處理這個需求變得非常容易。現在我們將繼續進行一個簡單而小型的Rails項目。
像往常一樣,讓我們從一個名爲testfile的新Rails應用程式開始。讓我們使用simple rails命令創建應用程式的基本結構。
tp> rails new testfile
在開始應用程式開發之前,我們應該安裝gem文件,如下所示−
gem install carrierwave gem install bootstrap-sass
打開gemfile並在底部添加以下兩個gem,如下圖所示;
在gem文件中添加gems之後,我們需要在控制台上運行以下命令−
bundle install
Creating the Model
我們需要創建一個具有兩個字符串作爲名稱和附件的模型,如下所示;
rails g model Resume name:string attachment:string
我們需要創建如下所示的資料庫遷移;
rake db:migrate
我們需要生成如下所示的控制器;
rails g controller Resumes index new create destroy
偉大的!現在我們已經建立了基本結構。現在我們需要創建一個上傳程序。一個上傳程序來自carrierwave gem,它告訴carrierwave如何處理文件。簡而言之,它包含了所有的文件處理功能。運行命令創建上傳程序,如下所示
rails g uploader attachment
現在打開resume模型並調用上傳程序,如下所示。簡歷模型已放置在app/models/Resume.rb−
class Resume < ActiveRecord::Base mount_uploader :attachment, AttachmentUploader # Tells rails to use this uploader for this model. validates :name, presence: true # Make sure the owner's name is present. end
在使用控制器之前,我們需要修改config/routes.db,如下所示−
CarrierWaveExample::Application.routes.draw do resources :resumes, only: [:index, :new, :create, :destroy] root "resumes#index" end
讓我們編輯控制器,如下所示。
class ResumesController < ApplicationController def index @resumes = Resume.all end def new @resume = Resume.new end def create @resume = Resume.new(resume_params) if @resume.save redirect_to resumes_path, notice: "The resume #{@resume.name} has been uploaded." else render "new" end end def destroy @resume = Resume.find(params[:id]) @resume.destroy redirect_to resumes_path, notice: "The resume #{@resume.name} has been deleted." end private def resume_params params.require(:resume).permit(:name, :attachment) end end
讓我們在css文件中添加引導實現。css文件可以在app/assets/stylesheets/resumes.css.scss中
@import "bootstrap";
現在打開app/views/layouts/application.html.erb並添加如下所示的代碼−
<!DOCTYPE html> <html> <head> <title>Tutorialspoint</title> <%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %> <%= javascript_include_tag "application", "data-turbolinks-track" => true %> <%= csrf_meta_tags %> </head> <body> <div class = "container" style = "padding-top:20px;"> <%= yield %> </div> </body> </html>
現在我們需要設置如下所示的索引視圖;
<% if !flash[:notice].blank? %> <div class = "alert alert-info"> <%= flash[:notice] %> </div> <% end %> <br /> <%= link_to "New Resume", new_resume_path, class: "btn btn-primary" %> <br /> <br /> <table class = "table table-bordered table-striped"> <thead>. <tr> <th>Name</th> <th>Download Link</th> <th> </th> </tr> </thead> <tbody> <% @resumes.each do |resume| %> <tr> <td><%= resume.name %></td> <td><%= link_to "Download Resume", resume.attachment_url %></td> <td><%= button_to "Delete", resume, method: :delete, class: "btn btn-danger", confirm: "Are you sure that you wish to delete #{resume.name}?" %></td> </tr> <% end %> </tbody> </table>
現在,讓我們編輯new.html.erb並添加表單代碼。
<% if !@resume.errors.empty? %> <div class = "alert alert-error"> <ul> <% @resume.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> </div> <% end %> <div class = "well"> <%= form_for @resume, html: { multipart: true } do |f| %> <%= f.label :name %> <%= f.text_field :name %> <%= f.label :attachment %> <%= f.file_field :attachment %> <%= f.submit "Save", class: "btn btn-primary" %> <% end %> </div>
現在啓動伺服器並訪問http://localhost:3000。它將產生一個類似於如下的螢幕&負;
我們需要做的最後一件事是過濾允許的文件類型列表。爲此,我們需要在app/uploaders/attachment_uploader.rb添加如下所示的簡單代碼
class AttachmentUploader < CarrierWave::Uploader::Base storage :file def store_dir "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" end def extension_white_list %w(pdf doc htm html docx) end end
現在啓動伺服器並訪問http://localhost:3000。現在輸入一個錯誤的格式;它將生成一個錯誤的消息,如下所示;
有關文件對象的完整詳細信息,您需要閱讀Ruby參考手冊。