Ruby on rails Rails 4-Carrierwave图像未上载
更新:感谢大家帮助我们解决这个问题。我决定放弃学习,并在概要文件模型中添加了另一个图像属性。现在就这样吧 我正在尝试在rails 4中制作一个应用程序 我有一个用户模型,上面有一个头像属性 我还有一个侧面模型 用户:有一个配置文件 个人资料:属于用户 我之所以拆分它们,是因为概要文件包含所有变量,而用户包含所有固定属性,这些属性在没有管理员许可的情况下无法更改 例外情况是,我的用户模型有一个头像(图像)属性,我想允许用户更改它 我在代码的其他部分有用户carrierwave,它可以正常工作。然而,在这个用例中有些地方是错误的 我有一个阿凡达上传器,带有:Ruby on rails Rails 4-Carrierwave图像未上载,ruby-on-rails,carrierwave,nested-forms,nested-attributes,Ruby On Rails,Carrierwave,Nested Forms,Nested Attributes,更新:感谢大家帮助我们解决这个问题。我决定放弃学习,并在概要文件模型中添加了另一个图像属性。现在就这样吧 我正在尝试在rails 4中制作一个应用程序 我有一个用户模型,上面有一个头像属性 我还有一个侧面模型 用户:有一个配置文件 个人资料:属于用户 我之所以拆分它们,是因为概要文件包含所有变量,而用户包含所有固定属性,这些属性在没有管理员许可的情况下无法更改 例外情况是,我的用户模型有一个头像(图像)属性,我想允许用户更改它 我在代码的其他部分有用户carrierwave,它可以正常工作。然而
class AvatarUploader < CarrierWave::Uploader::Base
# Include RMagick or MiniMagick support:
# include CarrierWave::RMagick
include CarrierWave::MiniMagick
# Choose what kind of storage to use for this uploader:
# storage :file
storage :fog
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
def cache_dir
"#{Rails.root}/tmp/uploads"
end
# Provide a default URL as a default if there hasn't been a file uploaded:
# def default_url
# # For Rails 3.1+ asset pipeline compatibility:
# # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
#
# "/images/fallback/" + [version_name, "default.png"].compact.join('_')
# end
# Process files as they are uploaded:
# process :scale => [200, 300]
#
# def scale(width, height)
# # do something
# end
# Create different versions of your uploaded files:
# version :thumb do
# process :resize_to_fit => [50, 50]
# end
process :resize_to_fit => [800, 800]
# Create different versions of your uploaded files:
version :thumb do
process :resize_to_fill => [200,200]
end
version :profile do
process :resize_to_fill => [345,245]
end
version :wide do
process :resize_to_fill => [951,245]
end
version :preview do
process :resize_to_fill => [90,90]
end
version :small do
process :resize_to_fill => [35,35]
end
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
def extension_white_list
%w(jpg jpeg gif png)
end
# Override the filename of the uploaded files:
# Avoid using model.id or version_name here, see uploader/store.rb for details.
# def filename
# "something.jpg" if original_filename
# end
end
我还尝试在我的配置文件模型中允许用户属性(如下所示):
我的视图用户文件夹中有一个部分表单
<%= simple_fields_for :user, html: { multipart: true } do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= f.input :avatar, as: :file, :label => "Add a profile image (head shot)" %>
</div>
<% end %>
“添加个人资料图像(头像)”%>
该部分包含在我的个人资料表中
然后,我想在我的个人资料显示视图中显示用户化身,如下所示:
<div class="col-md-5 col-lg-4 vc-photo" style= "background-image: url(<%= image_url @profile.user.avatar.url if @profile.user.avatar? %>);"> </div>
然而,它只是呈现一个空白
我试过:
);">
但它仍然只是呈现为空白
有人能看出我做错了什么吗
当我试图通过检查user.avatar在rails控制台中进行测试时,我得到以下信息:
u、 化身
=>,最后一次签名ip:,确认令牌:“73abb47df224dbc3a612b46ced66e1aba…”,确认地址:“2016-04-02 07:13:57”,确认发送地址:“2016-04-02 22:59:44”,未确认电子邮件:testiest@gmail.com,尝试失败:0,解锁令牌:无,锁定位置:无,创建位置:2016-04-02 07:13:57,更新位置:2016-04-02 22:59:43“,头像:无,批准:假>,@mounted_as=:头像>
接受下面的建议
我更改了表格,以便配置文件表格现在具有:
<%= render 'users/profileimgform', f: f %>
<%= simple_fields_for :user, html: { multipart: true } do |ff| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= ff.input :avatar, as: :file, :label => "Add a profile image (head shot)" %>
</div>
<% end %>
用户/档案imgform现在有:
<%= render 'users/profileimgform', f: f %>
<%= simple_fields_for :user, html: { multipart: true } do |ff| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= ff.input :avatar, as: :file, :label => "Add a profile image (head shot)" %>
</div>
<% end %>
“添加个人资料图像(头像)”%>
我不确定是否需要将“ff”合并到我的个人资料表单中的行中。我尝试将最后一个“f”替换为“ff”,但在询问是否应为单个“f”时出错
当我尝试此操作时,控制台仍然显示user.avatar为“nil”。我猜您的代码有错误:
<%= simple_fields_for :user, html: { multipart: true } do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= f.input :avatar, as: :file, :label => "Add a profile image (head shot)" %>
</div>
<% end %>
“添加个人资料图像(头像)”%>
看看生成的html。我认为应该有这样的东西:
<%= simple_form_for :profile do |f| %>
...
<%= f.simple_fields_for :user do |ff| %>
<%= ff.input :avatar %>
<% end %>
<% end %>
<%= form_for @person do |f| %>
Addresses:
<ul>
<%= f.fields_for :addresses do |addresses_form| %>
<li>
<%= addresses_form.label :kind %>
<%= addresses_form.text_field :kind %>
</li>
<% end %>
</ul>
<% end %>
...
请注意,嵌套表单或复杂表单应该连接模型,并与的表单和帮助程序的字段相关联,如下所示:
<%= simple_form_for :profile do |f| %>
...
<%= f.simple_fields_for :user do |ff| %>
<%= ff.input :avatar %>
<% end %>
<% end %>
<%= form_for @person do |f| %>
Addresses:
<ul>
<%= f.fields_for :addresses do |addresses_form| %>
<li>
<%= addresses_form.label :kind %>
<%= addresses_form.text_field :kind %>
</li>
<% end %>
</ul>
<% end %>
app/models/profile.rb
class Profile < ActiveRecord::Base
belongs_to :user
accepts_nested_attributes_for :user
end
类配置文件
实际上,有两种方法可以修改模型的嵌套属性
在同一表单中修改模型和嵌套属性
您应该使用模型和关联构建一个复杂的表单
更多信息:
app/controllers/profile_controller.rb
class ProfileController < ApplicationController
private
def profile_params
params.require(:profile).permit(:title, user_attributes: [:avatar])
end
end
class ProfileController
app/views/profile/edit.html.erb
<%= form_for :profile do |f| %>
Avatar:
<ul>
<%= f.fields_for :user do |uf| %>
<li>
<%= uf.label :avatar %>
<%= uf.file_field :avatar %>
</li>
<% end %>
</ul>
<% end %>
化身:
-
仅修改嵌套属性
您可以只为该关联属性构建一个普通表单,但当您必须初始化它时,它会变得棘手和模糊,因此我不想在这里提供示例代码,而不愿让您感到困惑。我通过将化身从用户移动到配置文件来解决这个问题 我也犯了同样的错误。如果您在mac上,请再次尝试安装imagemagik。我用自制的。您只需运行以下命令:
brew install imagemagick
所以图像不是零,对吗?你可以在控制台上试试,它是零。我在上面添加了rails c输出,您有storage:fog
,因此我猜您的远程图像存储(S3或其他)配置正确。您可以尝试在控制台上载文件:profile.user.avatar=Rack::Test::UploadedFile.new(file.open(file.join(Rails.root,'my_file_path.jpg'))
Errno::enoint:No这样的文件或目录@rb_sysopen-/Users/lem/cl/3/oldway.jpgmy_file_path.jpg
是指向Rails应用程序的文件路径,我尝试了这个-我更新了我的问题以显示我的尝试。我的user.avatar仍然为零。嗨,亚历克斯-你想看哪一位?我想在其中显示化身的个人资料显示页面?我可以在控制台中看到阿凡达为零,因此它没有保存到db“添加配置文件图像(头像)”%>抱歉,Alex。我不知道这是什么意思。@user2860931,处理嵌套表单很复杂,本文也可能有帮助: