在轨道上的ruby中的现有表中添加新列**附件**

时间:2016-12-16 15:10:20

标签: ruby-on-rails

好的我有一个名为ticket的简单rails应用程序。在这里我创建票证并存储到数据库中。我用脚手架生成它。

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

应用程序运行正常。我可以创建,编辑和更新故障单。我对创建故障单而不是编辑和删除感兴趣。

现在我想在名为 attachment 的数据库中添加一个新列,其中一个人可以上传word,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 %>

我在上传文档的一些消息来源上发现了一些我们需要创建一个包含三列(filename,content_type,data)的表,我想把这些列添加到现有的票表中,但是我不知道#39;我不知道我需要在new.html.erb文件中制作什么内容。在这个文件中,我正在加载您可以输入信息的表单,我想在此页面上显示一个上传文件的字段。

ruby​​ -v:2.2.6p396 rails -v:5.0.0.1(请回复我也可以在rails 4.0上使用解决方案)

2 个答案:

答案 0 :(得分:0)

要添加附件,您可以使用carrierwavepaperclip等宝石。我个人使用回形针,但两者都很好。

手动完成:

在终端cd to app文件夹中运行:

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参数中允许此操作。看起来应该是这样的:

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

希望这有帮助。

答案 1 :(得分:0)

正如@Brad所提到的,你可以使用paperclip或carrierwave来添加附件。我将在此示例中使用paperclip。 ( 注意: 我在此示例中使用rails 5.0.0.1,并在Rails 4.x中使用命令rails db:migrate。它将是{{1 }})

首先让我们做一些脚手架然后你可以改变你的代码以满足你的需要。

rake db:migrate

rails g scaffold User name:string rails g scaffold Post title:string body:text user:references 添加到用户模型,然后运行has_many :posts

添加gem文件:rails db:migrate并运行:gem "paperclip", "~> 5.0.0"

让我们生成回形针附件:bundle install并运行rails generate paperclip user docs

将附件,验证和内容类型添加到我们的用户模型中:

rails db:migrate

为属性白名单添加 users_controller.rb 强参数:

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

表单的编码必须设置为 multipart / form-data 才能上传文件 def user_params params.require(:user).permit(:name, :docs) end 所以对于我们的附件,我们需要更改我们的表单部分 app / views / users / _form.html.erb

html: { multipart: true }

并在表单中添加必填字段:

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

重新启动我们的服务器 <div class="field"> <%= f.label :docs %> <%= f.file_field :docs %> </div> 后,转到网址用户/新,我们可以看到新的字段附件。上传文档后,我们可以在我们的控制台上检查它是否已上传:rails s并运行示例rails c,这表明我们在数据库中的字段已填充:

enter image description here

最后一步是在我们的观看次数 app / views / users / show.html.erb 中显示该文档,以便用户可以在浏览器中下载或打开它:

User.all

修改

让我们回到你的项目并做到这一点:

首先,您应该将Paperclip gem添加到Gemfile <%= link_to "My document", @user.docs.url, target: "_blank" %> 并在命令行中运行gem "paperclip", "~> 5.0.0"

生成附件:bundle install(这将生成迁移文件并向其添加附件字段)

在Rails 4中运行rails generate paperclip ticket attachmentrails db:migrate) 转到Ticket模型并添加:

rake db:migrate

然后到 tickets_controller.rb 并编辑强参数:

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

转到您的部分 _form.html.erb

在表单中修改以下代码:

   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| %>

以及显示页面的最后一步添加:

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

重新启动服务器,上传文档并尝试它是否有效。