Ruby on rails 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,它可以正常工作。然而

更新:感谢大家帮助我们解决这个问题。我决定放弃学习,并在概要文件模型中添加了另一个图像属性。现在就这样吧

我正在尝试在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? %>);">&nbsp;</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.jpg
    my_file_path.jpg
    是指向Rails应用程序的文件路径,我尝试了这个-我更新了我的问题以显示我的尝试。我的user.avatar仍然为零。嗨,亚历克斯-你想看哪一位?我想在其中显示化身的个人资料显示页面?我可以在控制台中看到阿凡达为零,因此它没有保存到db“添加配置文件图像(头像)”%>抱歉,Alex。我不知道这是什么意思。@user2860931,处理嵌套表单很复杂,本文也可能有帮助: