Вложенные атрибуты и взаимодействие с хэшем формы и установка для user_id значения current_user.id - PullRequest
0 голосов
/ 24 марта 2012

Я переписал этот вопрос, так как другой показался слишком многословным. У меня есть следующая структура модели, и я заинтересован в том, чтобы загружать набор файлов (по 2 за раз через конструктор). Я не уверен, что полиморфный релат

class Item < ActiveRecord::Base
  has_many :assets, :as => :assetable, :dependent => :destroy
  accepts_nested_attributes_for :assets, :allow_destroy => true, :reject_if => lambda { |a| a[:asset].blank? } 
  attr_accessible :assets_attributes, :asset

  ...
end

class Asset < ActiveRecord::Base
   belongs_to :assetable, :polymorphic => true
   attr_accessible :name, :user_id, :description ...

   ...
end

Я скопировал всю форму:

<form accept-charset="UTF-8" action="/arc/items/70" class="edit_item" enctype="multipart/form-data" id="edit_item_70" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="_method" type="hidden" value="put" /><input name="authenticity_token" type="hidden" value="NnaCxwmfy2zT8MnN7oNQnOx0xYXkgKUs+NbIh8+8cL4=" /></div>
  <div class='files'>
        <input id="item_assets_attributes_70_asset" name="item[assets_attributes][70][asset]" type="file" />
        <input id="item_assets_attributes_70_description" name="item[assets_attributes][70][description]" size="30" type="text" />


        <input id="item_assets_attributes_71_asset" name="item[assets_attributes][71][asset]" type="file" />
        <input id="item_assets_attributes_71_description" name="item[assets_attributes][71][description]" size="30" type="text" />
</div>
<input name="commit" type="submit" value="Update Menu item" />
</form>

и вот контроллер для взаимодействия с ним:

class ItemsController < ApplicationController
...
def update
  item=params[:item]
  item[:assets_attributes].values do |v|
    v[:asset][:user_id]=3 # just hard-code it to see if workig
  end

  if @item.update_attributes(item)
    flash[:notice]="Menu Item has been updated #{undo_link}"
  else 
    flash[:notice]="Menu Item has not been updated"
  end
end

В моем классе активов никогда не устанавливается user_id. Как бы я сделал эту работу? Я, очевидно, хочу получить current_user.id.

1012 * ТНХ *

edit # 1

Использование Rails 3.1

редактировать 2

Одна вещь, которую я заметил, это то, что если я установил переменную экземпляра в цикле, а затем отладил ее в представлении, он не был установлен, означая, что этот цикл даже не работает.

item[:assets_attributes].values do |v|
  v[:user_id]=3
  @a="here is a string"
end

Я также обновил модель Предмета с помощью соответствующего атрибута attr_accessible для класса предмета.

Ответы [ 2 ]

1 голос
/ 24 марта 2012

В этом блоке вы ничего не делаете.

item[:assets_attributes].values do |v|
  v[:user_id]=3 # just hard-code it to see if working
end

values просто возвращает значения, поэтому вам нужно иметь итератор, такой как each, если вы хотите взаимодействовать с этими значениями,Попробуйте это

item[:assets_attributes].values.each do |v|
  v[:user_id]=3 # just hard-code it to see if working
end
0 голосов
/ 24 марта 2012

Кажется вероятным, что вы не можете массово назначить user_id.Либо:

Вы определили attr_accessible, и он не включает user_id Вы определили attr_protected, и он включает user_id Вы используете Rails 3.2, что делает это автоматически, чтобы предотвратить переназначение объекта другому пользователю с помощью массовогоприсваивание (которое является дырой в безопасности).

Если это так, то лучше всего ставить пользователя вместо него напрямую через asset.user= (или, я полагаю, разрешить массовое назначение user_id).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...