Ruby on rails 视图不打印数据库列值(Ruby on Rails)

Ruby on rails 视图不打印数据库列值(Ruby on Rails),ruby-on-rails,google-cloud-storage,Ruby On Rails,Google Cloud Storage,标题也可以是:update_column语句不在数据库中保存值,尽管日志表明发生了这种情况 我想将PDF文件上传到谷歌云存储,开始时我下载了谷歌的Rails示例应用程序,该应用程序可以完美地上传和下载 然后我将代码复制到我自己的应用程序中,请参见下面的相关文件和文件上传 但是,由于某些原因,在upload.rb模型文件中,当使用Google Cloud上pdf_文件的正确url更新文件数据库列m时,该值不会保存在数据库中。 日志表明它已保存为SQL 0.3ms UPDATE uploads SE

标题也可以是:update_column语句不在数据库中保存值,尽管日志表明发生了这种情况

我想将PDF文件上传到谷歌云存储,开始时我下载了谷歌的Rails示例应用程序,该应用程序可以完美地上传和下载 然后我将代码复制到我自己的应用程序中,请参见下面的相关文件和文件上传

但是,由于某些原因,在upload.rb模型文件中,当使用Google Cloud上pdf_文件的正确url更新文件数据库列m时,该值不会保存在数据库中。 日志表明它已保存为SQL 0.3ms UPDATE uploads SET file='1'行中的内容https://pdf-uploads.storage.googleapis.com/uploads/2/Selection_002.png'WHERE uploads.id=?[[id,2]]。当我试图在视图中检索链接以显示它时,文件列似乎为空

Web服务器日志

upload.rb模型文件

上载\u controller.rb

从rails控制台检查新条目

Upload.last
Upload Load (0.6ms)  SELECT  "uploads".* FROM "uploads"  ORDER BY "uploads"."id" DESC LIMIT 1
=> #<Upload id: 2, songname: "Hello", artist: "Adele", album: "Hello - Single", level: 1, video: "", file: "https://pdf-uploads.storage.googleapis.com/uploads...", downloads: 0, views: 2, user_id: 1, genre_id: 5, created_at: "2015-12-25 05:19:42", updated_at: "2015-12-25 05:20:07">
正如您所看到的,它在文件列中插入了一个值,该值由于某种原因被截断……不确定这只是为了保持输出简短,还是被截断的值实际存储在数据库中。 文件:https://pdf-uploads.storage.googleapis.com/uploads... 现在,问题就从这里开始。 在我看来,我有一行代码上传URL:打印出数据库文件列,它不会打印任何内容,就像文件属性为空一样。。正如我所解释的,我检查了该列绝对不是空的

我使用table_print gem从rails控制台打印数据库表,它再次将file列显示为空白列,不知道为什么会这样做。Rails记录打印机显示被截断的url存储在数据库中

同样,我昨晚花了几个小时才弄明白这一点,但我自己也弄不明白。提前感谢您的帮助。

attr\u访问者正在为您制造问题

你为什么要用它?该字段已存在于数据库中

如果rails3使用属性可访问rails4强参数

编辑:

删除属性访问器:文件


在上载\u控制器中,添加文件字段以上载\u参数方法。

确保允许上载所有相关参数,包括:文件

# app/controllers/uploads_controller.rb
class UploadsController < ApplicationController
  def create
    ...
  end

  private

  def upload_params
    params.require(:some_required_param).permit(:genre_id, :file)
  end
end
然后确保表单上有:multipart=>true

# some_view.html.erb
<%= form_tag({:action => "create"}, :method => :post, :multipart => true do %>
处的注释是由于变量“file”是字符串。如果你要归档的话。是吗?字符串Ruby将证实这一点。我假设文件是一个URL:


你能试着打印@upload.album或其他字段,看看它是否被打印出来吗?另外,请尝试在控制器或视图中输入puts\nURL{@upload.file}\n并检查。是的,其他列打印良好:忘了提及这一点。我试了你的建议。puts\nURL{@upload.file}\n打印URL和空格,但不打印变量。我使用它是因为Google示例应用程序使用了它。你能扩展这个答案吗?我使用的是Rails 4.2.5。我必须做什么才能使强参数工作?谢谢,我现在得到了这个:undefined method original_filename'for:String`on-line key:uploads/{id}/{file.original_filename},在upload_file中。传递的参数显然包含原始的\u文件名。请参见此处:file=>}它与此问题无关,尽管您必须使用carrierwave,但请允许在upload_params方法中使用这些相关参数。我没有使用carrierwave。我使用的是gcloud,它使用雾。我的档案里有那些宝石。如果我创建了一个新问题,它将包含与此页面完全相同的信息。重点是什么?参数是允许的。我使用的是启用了多部分的简单表单。{:multipart=>true},class:form horizontal do | f |%>我认为文件路径需要在self前面加上前缀。对属性进行修改。
Upload.last
Upload Load (0.6ms)  SELECT  "uploads".* FROM "uploads"  ORDER BY "uploads"."id" DESC LIMIT 1
=> #<Upload id: 2, songname: "Hello", artist: "Adele", album: "Hello - Single", level: 1, video: "", file: "https://pdf-uploads.storage.googleapis.com/uploads...", downloads: 0, views: 2, user_id: 1, genre_id: 5, created_at: "2015-12-25 05:19:42", updated_at: "2015-12-25 05:20:07">
# app/controllers/uploads_controller.rb
class UploadsController < ApplicationController
  def create
    ...
  end

  private

  def upload_params
    params.require(:some_required_param).permit(:genre_id, :file)
  end
end
# some_view.html.erb
<%= form_tag({:action => "create"}, :method => :post, :multipart => true do %>
=> #<Upload id: 2, songname: "Hello", 
   artist: "Adele", album: "Hello - Single",
   level: 1, video: "", 
   file: "https://pdf-uploads.storage.googleapis.com/uploads...", 
   downloads: 0, views: 2, user_id: 1, genre_id: 5, 
   created_at: "2015-12-25 05:19:42", updated_at: "2015-12-25 05:20:07">
# app/models/upload.rb
  def file_path
    attributes['file']
  end

# app/views/uploads/index.html.erb
  <%= @upload.file_path %>