首页 文章

Rails 4 - Carrierwave图像无法上传

提问于
浏览
4

UPDATE :感谢大家帮忙解决这个问题 . 我决定放弃尝试学习并为配置文件模型添加另一个图像属性 . 这将是现在必须做的 .

我试图在rails 4中制作应用程序 .

我有一个用户模型,上面有一个头像属性 .

我也有 Profiles 模型 .

用户:有一个 Profiles Profiles :属于用户

我拆分它们的原因是因为配置文件包含所有变量,而用户包含所有未经管理员权限无法更改的固定属性 .

例外是我的用户模型具有我想允许用户更改的头像(图像)属性 .

我在我的代码的其他部分有用户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

在我的用户模型中,我有:

class User < ActiveRecord::Base
  mount_uploader :avatar, AvatarUploader
end

在我的用户控制器中 - 我将强化参数中的头像列入白名单 .

在我的 Profiles 控制器强大的参数我试过添加:

params.require(:profile).permit(:title, :overview, user_attributes: [:avatar])

我也尝试在我的 Profiles 模型中允许用户属性(如下所示):

belongs_to :user
accepts_nested_attributes_for :user

我的视图用户文件夹中有一个部分表单 .

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

部分内容包含在我的 Profiles 表格中 .

然后,我想在我的 Profiles 显示视图中显示用户头像:

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

但是,它只是呈现一个空白 .

我试过了:
);“>
但它仍然只是呈现空白 .

谁能看到我做错了什么?

When i try to test in the rails console by checking the user.avatar, I get this:

u.avatar =>#,last_sign_in_ip:#,confirmation_token:“73abb47df224dbc3a612b46ced66e1aba ...”,confirmed_at:“2016-04-02 07:13:57”,confirmation_sent_at:“2016-04-02 22:59:44”, unconfirmed_email:“testiest@gmail.com”,failed_attempts:0,unlock_token:nil,locked_at:nil,created_at:“2016-04-02 07:13:57”,updated_at:“2016-04-02 22:59:43 “,avatar:nil,approved:false>,@ mounted_as =:avatar>

TAKING THE SUGGESTION BELOW

我更改了表单,以便配置文件表单现在具有:

<%= render 'users/profileimgform', f: f %>

users / profileimgform现在具有:

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

我不确定是否需要在我的 Profiles 表格中将'ff'纳入该行 . 我尝试用'ff'替换最后的'f'但是错误地询问我是否应该是单个'f' .

当我尝试这个时,控制台仍然显示user.avatar是'nil' .

4 回答

  • 0

    我想这个代码有错误:

    <%= 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 %>
    
  • 0

    请注意,嵌套表单或复杂表单应该与 form_forfields_for helper连接模型和关联,如下所示:

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

    模型和关联之间的连接方式是

    • form_for @person 构建人员表单实例 f

    • 使用人员表单实例 f 构建关联表单 f.fields_for :addresses 实例 addresses_form

    • 使用关联表单输入上传文件 addresses_form.input ...

    最后,我猜 simple_fields_forextra helpers的simple_form,也许它只适用于 form_for 帮助器 .


    以下是给定模型和控制器的示例:

    应用程序/模型/ user.rb

    class User < ActiveRecord::Base
      mount_uploader :avatar, AvatarUploader
      has_one :profile
    end
    

    应用程序/模型/ profile.rb

    class Profile < ActiveRecord::Base
      belongs_to :user
      accepts_nested_attributes_for :user
    end
    

    实际上,有两种方法可以修改模型的嵌套属性 .

    • 以相同的形式修改模型和嵌套属性

    您应该使用模型和关联构建复杂的表单

    更多信息:http://guides.rubyonrails.org/form_helpers.html#building-complex-forms

    应用程序/控制器/ profile_controller.rb

    class ProfileController < ApplicationController
    
      private
    
      def profile_params
        params.require(:profile).permit(:title, user_attributes: [:avatar])
      end
    end
    

    应用程序/视图/资料/ 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 %>
    
    • 仅修改嵌套属性

    你可以为那个关联属性构建一个普通的表单,但是当你必须初始化它时它很棘手和模糊,所以我宁愿不在这里提供示例代码而不是让你感到困惑 .

  • 0

    我有同样的错误 . 如果你在Mac上,请尝试再次安装imagemagik . 我用过自制软件 . 您只需要运行此命令:

    brew install imagemagick
    
  • 1

    我通过将头像从用户移动到 Profiles 来解决问题 .

相关问题