form_for для таблицы отношений с типом отношения многие ко многим - PullRequest
1 голос
/ 02 февраля 2011

Моя цель - показать окно выбора для каждого отношения для пользователей и конкретного проекта. Все пользователи должны быть перечислены, но только пользователи проекта имеют некоторый тип отношений. Другие пользователи не выбрали ни одного в своем поле выбора.

У меня есть эта модель:

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.

...