2015-07-09 3 views
0

Каждый пользователь 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 %> 

ответ

0

решаемая. Связь между character.rb и picturething.rb не была полностью определена. Это фиксирует это:

character.rb:

has_many :standardpictures, class_name: "Picturething", 
          inverse_of: :character, 
          foreign_key: "character_standard_id", 
          dependent: :destroy 
accepts_nested_attributes_for :standardpictures 

has_one :profilepicture, class_name: "Picturething", 
          inverse_of: :character, 
          foreign_key: "character_profile_id", 
          dependent: :destroy 

picturething.rb:

belongs_to  :character, class_name: "Character", 
          inverse_of: :standardpictures, 
          foreign_key: :character_standard_id 
belongs_to  :character, class_name: "Character", 
          inverse_of: :profilepicture, 
          foreign_key: :character_profile_id 

Plus миграции добавить: character_standard_id и: character_profile_id для Picturething в базе данных.

Интересно, что для Picturething требуется два столбца: character_standard_id и: character_profile_id, но каждый столбец будет содержать только одно значение. Вторая колонка кажется излишней. Я попытался заставить его работать только с одним столбцом, но не смог. Было ли это из-за невозможности или из-за моей некомпетентности (я подозреваю, что последнее), но было бы хорошо знать: может ли эта проблема быть решена с помощью одного столбца id в базе данных Picturething?