AdilA
@AdilA
Нравится кодить, изучаю go c echo

Как правильно организовать nested form'у для трех моделей?

Добрый день!
Есть компании, у компаний может быть много пользователей, у пользователей может быть много компаний, у пользователей в каждой компании есть одна должность.
Как правильно оформить форму для того чтобы можно было редактировать должность?
Модель Position = Должность
базу сделал так:
id|user_id|company_id|name|
class Company < ActiveRecord::Base
  has_many :users_companies
  has_many :users, through: :users_companies
  has_many :positions
end

class User < ActiveRecord::Base
  has_many :companies, through: :users_companies
  has_many :users_companies
  has_many :positions
end

class Position < ActiveRecord::Base
  belongs_to :user
  belongs_to :company
end


class UsersController < ApplicationController
  def edit
    @company = Company.find(params[:company_id])
    @user = User.find(params[:id])
  end
  def update
    @user = User.find(params[:id])
    if @user.update(user_params)
      redirect_to :back
    end
  end
  private
  def user_params
    params.require(:user).permit(:last_name, :first_name, :middle_name)
  end
end

Делаю форму а на ней высвечиваются все должности со всех компаний
<%= form_for @user do |f| %>
<%= f.label :last_name, "Фамилия" %><br />
    <%= f.text_field :last_name, type: "text" %>

    <%= f.label :first_name, "Имя" %><br />
    <%= f.text_field :first_name, type: "text" %>

    <%= f.label :middle_name, "Отчество" %><br />
    <%= f.text_field :middle_name, type: "text" %>
    <%= f.fields_for :positions do |ff| %>
    <%= ff.label :name, "Должность" %>
    <%= ff.text_field :name, type: "text" %>
    <%= ff.hidden_field :company_id, value: @company.id %>
    <% end %>
    <%= f.submit "Сохранить", class: "login loginmodal-submit", type: "submit"  %>
<% end %>

Как сделать форму чтобы можно было отредактировать существующую запись принадлежащей текущей компании?
  • Вопрос задан
  • 171 просмотр
Решения вопроса 1
@jarosluv
Если я правильно понял вопрос, то в самом простом случае так:

#controller
@position = Position.find_by(user: params[:id], company: params[:company_id])

#view
<%= f.fields_for :positions, @position do |ff| %>


А также не забудьте поправить модель User и user_params в контроллере.
api.rubyonrails.org/classes/ActiveRecord/NestedAtt...
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
insiki
@insiki
broken pipe
c3gdlk
@c3gdlk
Ментор в http://rubyboost.ru/
Чтобы вывести только позиции компании нужно их явно задать в контроллере

@user.positions = @company.positions.where(user: @user)


Но, я не думаю, что это будет работать, потому что сохранение скорее всего сотрет позиции других компаний.

В этом случае проще написать эту логику явно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы