Каждый пользователь has_one Character. Каждый символ has_one: profilepicture, класса Picturething, в котором содержится mount_uploader Carrierwave для загрузки одного изображения. Каждый символ has_many: standardpictures, также класса Picturething. Загрузка изображения обрабатывается в представлениях/пользователях/редактировании, которые попадают в метод update_pictures в users_controller.Rails carrierwave has_many error
Идея состоит в том, чтобы загрузить одну стандартную картинку за раз. Кажется, что это работает, консоль Rails> Picturething.all показывает, что в базу данных добавлена новая Picturething, и она правильно отображается на странице. Это предназначено для того, чтобы быть одним из символов.
Странная вещь, так или иначе в этом процессе, характер: profilepicture также установлен на ту же самую фотографию, которая была загружена. Я не понимаю, как это происходит. Ни в коем случае у меня нет кода, говорящего что-то вроде «@ character.profilepicture = standardpicture», но почему-то он решил, что и первый: standardpicture и: profilepicture - один и тот же. Если profilepicture существует, чего он еще не должен, он отображается на странице edit.html.erb, где у меня есть строка <% if @character.profilepicture.nil? %>
. Он отображает загруженную картинку здесь, поэтому четкость профиля не ноль, но это должно быть.
Как это происходит?
character.rb:
has_many :standardpictures, class_name: "Picturething", dependent: :destroy
accepts_nested_attributes_for :standardpictures
has_one :profilepicture, class_name: "Picturething", dependent: :destroy
accepts_nested_attributes_for :profilepicture
picturething.rb:
class Picturething < ActiveRecord::Base
belongs_to :character
mount_uploader :picture, CharacterpicUploader
validate :picture_size
end
приложение/просмотров/пользователей/edit.html.erb:
<%= form_for :standardpicture, url: update_pictures_user_path,
method: :post, html: { multipart: true } do |f| %>
<%= f.label :picture %>
<%= f.file_field :picture, accept: 'image/jpeg,image/gif,image/png' %>
<%= f.submit "Upload pictures", class: "btn btn-primary" %>
<% end %>
routes.rb:
post '/users/:callsign/update_pictures', to: 'users#update_pictures', as: :update_pictures_user
users_controller.rb:
def update_pictures
@character = Character.find_by(callsign: params[:callsign])
@user = @character.sociable
@standardpicture = @character.standardpictures.build(update_pictures_user_params)
if @standardpicture.save
flash[:success] = "Pictures updated"
redirect_to(edit_user_path(@user))
else
redirect_to(edit_user_path(@user))
end
end # update_pictures
def update_pictures_user_params
params.require(:standardpicture).permit(:picture)
end
Назад к приложение/просмотров/пользователей/edit.html.erb:
<% if @character.profilepicture.nil? %>
<p>Select a picture below to use as your profile picture</p>
<% else %>
<%= image_tag @character.profilepicture.picture %>
<% end %>