Моя цель - показать окно выбора для каждого отношения для пользователей и конкретного проекта.
Все пользователи должны быть перечислены, но только пользователи проекта имеют некоторый тип отношений. Другие пользователи не выбрали ни одного в своем поле выбора.
У меня есть эта модель:
class Project < ActiveRecord::Base
belongs_to :company
has_many :tasks, :order => 'state_type_id ASC'
has_many :project_user_relations
has_many :users, :through => :project_user_relations
def t_name
name.camelcase
end
end
class User < ActiveRecord::Base
belongs_to :company
has_many :tasks , :foreign_key => :assigned_user_id
has_many :project_user_relations
has_many :projects, :through => :project_user_relations
def full_name
firstname + ' ' + lastname
end
def relation_to(project)
relation=ProjectUserRelation.find_by_project_id_and_user_id(project.id, id)
relation ||= relation=ProjectUserRelation.new
end
end
class ProjectUserRelation < ActiveRecord::Base
belongs_to :project
belongs_to :user
has_one :project_user_relation_type
end
class ProjectUserRelationType < ActiveRecord::Base
def t_name
I18n.t("app.projects.users.relation.type."+code)
end
end
Я хочу создать форму для отображения всех пользователей, используя collection_select.
Я использовал код:
def edit_all
@project = Project.find(params[:project_id])
@users = User.all
....
в моем контроллере
маршруты работают нормально.
на мой взгляд:
<% @users.each do |user| %>
<%= f.fields_for :users, user do |user_fields| %>
<tr class="reference" rel="<%= parent_user_path(user) %>" >
<td class="name"><%= link_to user.full_name, parent_user_path(user) %></td>
<td class="email"><%= mail_to user.email %></td>
<td class="type">
<%= user_fields.fields_for user.relation_to @project do |relation_fields| %>
<%= relation_fields.collection_select :project_user_relation_type, ProjectUserRelationType.all, :id, :t_name, {:include_blank => false, :prompt => t("helpers.select.prompt") } %>
<% end %>
</td>
</tr>
<% end %>
<% end %>
или для теста:
<%= f.fields_for :users, @users do |xuser_fields| %>
<% logger.debug "#{self.to_s} xuser_fields = #{xuser_fields.object.inspect} ;" %>
<tr>
<td><%= xuser_fields.text_field :firstname %></td>
<td></td>
<td></td>
<td></td>
</tr>
<% end %>
но notnihng работает правильно
первый генерирует неправильное имя в html:
select id = "project_users_project_user_relation_project_user_relation_type" name = "project [users] [project_user_relation] [project_user_relation_type]"
второй порождает ошибку:
неопределенный метод `firstname 'для # Array: 0x4d03658
Можете ли вы помочь мне разрешить эту ситуацию?
PS: простите за длинный код: (
РЕШЕНИЕ (вероятно - решено чтением источников RoR)
Я нашел решение, я вещь.
метод
def name_attributes=(attributes)
# Process the attributes hash
end
в модели проекта отсутствует.
Это невероятное решение:].
Существует также точный синтаксис после fields_for:: name, @some_collection, где name должно быть точно таким же именем, как и в начале указанной функции в Model.