2016-12-16 7 views
0

私はチケットと呼ばれる簡単なレールアプリケーションを持っています。ここで私はチケットを作成し、データベースに格納します。足場を使ってそれを作りました。既存のテーブルに新しい列**を付け加える** ruby​​ on rails

It has 5 columns. (I generated it using scaffold) 
Name 
Seat id seq 
Address 
Price paid 
Email Address 

そして、アプリケーションは正常に動作しています。チケットを作成、編集、更新することができます。私は、編集や削除よりもチケットの作成に関心があります。

添付ファイルという名前のデータベースに新しい列を追加して、単語、pdfファイルをアップロードすることができます。私は多くのチュートリアルを見てきましたが、すでにいくつかのフィールドがある既存のテーブルにどのように組み込むことができるのか説明していません。

tickets_controller.rb

class TicketsController < ApplicationController 
    before_action :set_ticket, only: [:show, :edit, :update, :destroy] 

    def index 
    @tickets = Ticket.all 
    end 

    def show 
    end 

    def new 
    @ticket = Ticket.new 
    end 

    def edit 
    end 

    def create 
    @ticket = Ticket.new(ticket_params) 

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


    def update 
    respond_to do |format| 
     if @ticket.update(ticket_params) 
     format.html { redirect_to @ticket, notice: 'Ticket was successfully updated.' } 
     format.json { render :show, status: :ok, location: @ticket } 
     else 
     format.html { render :edit } 
     format.json { render json: @ticket.errors, status: :unprocessable_entity } 
     end 
    end 
    end 


    def destroy 
    @ticket.destroy 
    respond_to do |format| 
     format.html { redirect_to tickets_url, notice: 'Ticket was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 

    def set_ticket 
     @ticket = Ticket.find(params[:id]) 
    end 


    def ticket_params 
     params.require(:ticket).permit(:name, :seat_id_seq, :address, :price_paid, :email_address) 
    end 
end 

チケットモデル

class Ticket < ApplicationRecord 
end 

_form.html.erb

<%= form_for(ticket) do |f| %> 
    <% if ticket.errors.any? %> 
    <div id="error_explanation"> 
    <h2><%= pluralize(ticket.errors.count, "error") %> prohibited this ticket from being saved:</h2> 

    <ul> 
    <% ticket.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
    <% end %> 
    </ul> 
    </div> 
<% end %> 

<div class="field"> 
    <%= f.label :name %> 
    <%= f.text_field :name %> 
</div> 

<div class="field"> 
    <%= f.label :seat_id_seq %> 
    <%= f.text_field :seat_id_seq %> 
</div> 

<div class="field"> 
    <%= f.label :address %> 
    <%= f.text_area :address %> 
</div> 

<div class="field"> 
    <%= f.label :price_paid %> 
    <%= f.text_field :price_paid %> 
</div> 

<div class="field"> 
    <%= f.label :email_address %> 
    <%= f.text_field :email_address %> 
</div> 

<div class="actions"> 
    <%= f.submit %> 
</div> 
<% end %> 

new.html.erb

<h1>New Ticket</h1> 

<%= render 'form', ticket: @ticket %> 

<%= link_to 'Back', tickets_path %> 
私たちは3つの列(ファイル名、CONTENT_TYPE、データ)を使用してテーブルを作成する必要がドキュメントをアップロードするためのソースの一部にいくつかのを発見した、と私はこれらを追加すると思っ

既存のチケットテーブルに追加する必要がありますが、new.html.erbファイルでどのようなchnagesを作成する必要があるのか​​分かりません。このファイルでは、情報を入力できるフォームをロードしています。このページにファイルをアップロードするフィールドを表示します。

ルビー-v:2.2.6p396 レール-v:5.0.0.1あなたがcarrierwaveのような宝石を使用することができます添付ファイルを追加するための

+0

に依存します。簡単な方法は、ファイルをテーブルに追加するための移行を作成し、ファイルをアップロードするためにCarrierWaveをインストールすることです。これらのことは認識していますか? –

答えて

0

@Bradは、paperclipやcarrierwaveを使用して添付ファイルを追加することができます。この例ではpaperclipを使用します。(注:私は、この例では、レール5.0.0.1を使用していて、COMAND rails db:migrate Railsの4.xで、それはrake db:migrateになります。)

はのは、最初のいくつかの足場をやってみましょう、その後、あなたはあなたのコードを変更することができますあなたのニーズに合っています。

rails g scaffold User name:string 
rails g scaffold Post title:string body:text user:references 

Userモデルにhas_many :postsを追加し、宝石のファイルの追加rails db:migrate

を実行します。gem "paperclip", "~> 5.0.0"をして実行します。bundle install

のは、クリップの添付ファイルを生成してみましょう:検証、rails generate paperclip user docsをして添付ファイルを追加rails db:migrate

を実行しますユーザーモデルへのコンテンツタイプ:

has_attached_file :docs 
    validates_attachment :docs, :content_type => {:content_type => %w(application/pdf application/msword application/vnd.openxmlformats-officedocument.wordprocessingml.document)} 

users_controller.rbに属性のホワイトリストの強いのparams追加:フォームのエンコーディングが私たちの取り付けのために、我々は変更する必要があるので、ファイルにhtml: { multipart: true }をアップロードするためマルチパート/フォームのデータに設定する必要があります

def user_params 
     params.require(:user).permit(:name, :docs) 
    end 

を私たちのフォーム部分アプリ/ビュー/ユーザー/ _form.html.erb

<%= form_for @user, html: { multipart: true } do |f| %> 

そして追加私たちのフォームに必要なフィールド:

<div class="field"> 
    <%= f.label :docs %> 
    <%= f.file_field :docs %> 
    </div> 

当社のサーバーrails sを再起動し、新しいユーザーを/ URLにアクセスして後、私たちは、新しいフィールドの添付ファイルを見ることができます。 rails cをしてDBにおける当社のフィールドが装着されていることを示している例User.all、のために実行します:それはアップロードされています場合、ドキュメントをアップロードした後、私たちは、コンソールで確認することができます

enter image description here

そして、最後のステップは、文書を表示することです私たちの見解でアプリ/ビュー/ユーザー/ show.html.erbユーザーがブラウザでそれをダウンロードしたり、開くことができるように:

<%= link_to "My document", @user.docs.url, target: "_blank" %> 

EDIT


は背中のプロジェクトに取得し、それをやってみましょう:

まず、あなたのGemfile gem "paperclip", "~> 5.0.0"にペーパークリップの宝石を追加する必要があり、コマンドラインでbundle installを実行します。 はチケットモデルに移動し、追加rails generate paperclip ticket attachment(これは、移行ファイルを生成し、それに添付ファイルフィールドを追加します)

実行rails db:migraterake db:migrate 4のRailsで)::

has_attached_file :attachment 
    validates_attachment :attachment, :content_type => {:content_type => %w(application/pdf application/msword application/vnd.openxmlformats-officedocument.wordprocessingml.document)} 

その後

添付ファイルを生成しますtickets_controller.rbに変更し、強力なパラメータを編集してください:

def ticket_params 
     params.require(:ticket).permit(:name, :seat_id_seq, :address, :price_paid, :email_address, :attachment) 
    end 
下記のフォームに

<%= form_for @ticket, html: { multipart: true } do |f| %> 

は、このコードを追加します:

編集フォームで、以下のこのコード:

はあなたの部分_form.html.erbに移動します(それが添付された新しいフィールドになります)

<div class="field"> 
    <%= f.label :attachment %> 
    <%= f.file_field :attachment %> 
    </div> 

とあなたのショーのページの追加に最後のステップ:

<%= link_to "My document", @ticket.attachment.url, target: "_blank" %> 

サーバーを再起動してドキュメントをアップロードし、正常に動作するか試してみてください。

+0

rails g scaffold投稿のタイトル:文字列本文:テキストユーザ:参照、この行が実際に行っていること..私はテーブルチケットを持っているので、別のテーブルPostを作成してタイトルを追加する必要がありますか?それに。 –

+0

レール足場です。アプリケーションを生成するための素早い方法。タイトルと本文フィールドを持つポストMVCを生成し、 't.references:user、foreign_key:true'をマイグレーションファイルに追加することでUserモデルに参照します。私は例として答えました(チュートリアル)。あなたが周りを遊びたい場合を除き、あなたのコードを入れないでください。プロジェクトのリポジトリはありますか?私は私の答えを編集し、あなたを助けようとします – Blackcoat77

+0

私は私の答えを更新したので、今あなたのプロジェクトで試してみることができます。それがあなたのために働くかどうか私に教えてください? – Blackcoat77

0

を(私もレール4.0上のソリューションを使用することができるように返信してください)またはpaperclip。私は個人的にはペーパークリップを使用していますが、どちらも良いです。アプリのフォルダにターミナルCDに

をし、実行します:手動でそれを行うには

チケットの形で

rails g migration AddAttachmentToTickets attachment:blob

走行レール4 rake db:migrateまたはレールで5 rails db:migrate

あなたは今すぐ追加できます:

<div class="field"> 
    <%= f.label :attachment %> 
    <%= f.file_field :attachment %> 
</div> 

を確認し、ticketController paramsでこれを許可するようにしてください。これは次のようになります。

def ticket_params 
    params.require(:ticket).permit(:ticket_number,:description, :attachement) 
end 

希望します。

+0

アップロードされたファイルを表示しています#、データベースからダウンロードしてコンテンツを読むにはどうすればいいですか、Webページでダウンロードするにはどうすればいいですか? ? –

+0

このブログ記事の最後のセクションを読んでください。 http://over9000.org/rails/saving-ruby-on-rails-attachments-as-blobs – Brad

+0

すべての正直なところ、私は上記の宝石の1つを使用することをお勧めします。人生は宝石でもっと簡単です:) – Brad

関連する問題