rails - update_attributes только для части модели; загрузка файла - PullRequest
0 голосов
/ 02 марта 2012

Я хочу добавить возможность пользователю иметь несколько картинок, связанных с его / ее учетной записью.

У меня есть следующие классы:

class User < ActiveRecord::Base
  has_many :assets
  accepts_nested_attributes_for :assets
end

class Asset < ActiveRecord::Base
  belongs_to :assetable, :polymorphic => true
  belongs_to :user
end

Я хочу, чтобы у меня был экран с функцией загрузки изображений:

def add_profile_picture 
  @user=User.find(params[:id])
  1.times {@user.assets.build}
end

форма:

<%= form_for @user do |u| %>
  <%= u.fields_for :assets do |asset| %>
    <%= asset.file_field :asset %>
    <%= asset.text_field :description %><br />
  <% end %>
  <%=u.submit %>
<% end %>

Когда я отправляю сообщение, оно выглядит так, как будто значение id идёт нормально в development.log:

"id"=>"1" 

но я получаю ошибку:

неопределенный метод update_attributes для nil: NilClass

Поскольку у меня просто есть поля актива, нужно ли мне что-то особенное делать? Кроме того, из-за того, что own_to: пользователь существует, это может вызывать проблемы? В основном:

asset:
  user_id: 
  assetable_type:
  assetable_id:

Любая помощь будет принята с благодарностью. Не делайте много вещей из Rails.

1024 * ТНХ *

edit # 1

class UsersController < ApplicationController
  def add_profile_picture 
    @user=User.find(params[:id])
    1.times {@user.assets.build}
  end

ТНХ

1 Ответ

0 голосов
/ 02 марта 2012

Хорошо - здесь есть несколько проблем с вашим кодом. Я настоятельно рекомендую вам прочитать руководства Action Controller и Rails Routing , чтобы получить больше информации об этом.

В любом случае вы получаете сообщение об ошибке, поскольку ваша форма будет пытаться использовать действие users#update в UsersController.

У вас есть пара вариантов. Одним из них является создание необходимых маршрутов для настраиваемого действия, или вы можете создать вложенный ресурс и создать форму для добавления актива.

В этом случае вы бы сделали что-то вроде этого:

в routes.rb

resources :users do
  resources :assets, :only => [:new, :create] # Or any other actions you might want. It's best practise to limit these.
end

Затем в AssetsController вы можете сделать что-то похожее на это:

def new
  @asset = Asset.new
end

def create
  @asset = Asset.new(params[:asset])
  @asset.user_id = params[:user_id] if params[:user_id]
  @asset.save!
end

и ваша форма будет выглядеть примерно так:

<%= form_for @asset do |f| %>
  <%= f.file_field :asset %>
  <%= f.text_field :description %><br />
  <%=f.submit %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...