好的我有一个名为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上使用解决方案)
答案 0 :(得分:0)
要添加附件,您可以使用carrierwave或paperclip等宝石。我个人使用回形针,但两者都很好。
手动完成:
在终端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
,这表明我们在数据库中的字段已填充:
最后一步是在我们的观看次数 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 attachment
(rails 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>
重新启动服务器,上传文档并尝试它是否有效。