簡體   English   中英

Rails 4 - Carrierwave圖像無法上傳

[英]Rails 4 - Carrierwave image not uploading

更新 :感謝大家幫助我們解決這個問題。 我決定放棄嘗試學習並為配置文件模型添加另一個圖像屬性。 這將是現在必須做的。

我試圖在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

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

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

在我的用戶控制器中 - 我將強化參數中的頭像列入白名單。

在我的個人資料控制器強大的params我試過添加:

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

我還嘗試在我的個人資料模型中允許用戶屬性(如下所示):

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

部分內容包含在我的個人資料表格中。

然后我想在我的個人資料顯示視圖中顯示用戶頭像:

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

采取以下建議

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

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

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

我不確定是否需要在我的個人資料表格中將'ff'納入該行。 我嘗試用'ff'替換最后的'f',但是錯誤地詢問我是否應該是單個'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_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 f.fields_for :addresses形式
  • 使用關聯表單輸入來上傳文件addresses_form.input ...

最后,我想simple_fields_forsimple_fields_for 額外幫助者 ,也許它只適用於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

實際上,有兩種方法可以修改模型的嵌套屬性。

  1. 以相同的形式修改模型和嵌套屬性

您應該使用模型和關聯構建復雜的表單

更多信息: 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 %>
  1. 僅修改嵌套屬性

你可以為那個關聯屬性構建一個普通的表單,但是當你必須初始化它時它很棘手和模糊,所以我寧願不在這里提供示例代碼而不是讓你感到困惑。

我通過將頭像從用戶移動到個人資料來解決問題。

我有同樣的錯誤。 如果你在Mac上,請嘗試再次安裝imagemagik。 我用的是自制軟件。 您只需要運行此命令:

brew install imagemagick

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM