Форма Rails с ассоциацией own_to

Я очень новичок в Rails, поэтому это может быть очевидной проблемой, и если это так, я прошу прощения.

Я пытаюсь создать форму для создания записи User, которая имеет связь belongs_to с моделью Team. То, что я сделал до сих пор, это следующее...

<% form_for @user, url: {action: "create"} do |f| %>
  <%= f.text_field :name %>
  <%= f.text_field :email %>

  <% f.fields_for :team do |team| %>
    <%= team.collection_select(:team_id, Team.all, :id, :name) %>
  <% end %>
  <%= f.submit %>
<% end %>

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

def create
  @team = Team.find(params[:user][:team][:team_id])
  @team.users.create(user_params)
  # Ignoring error checking for brevity
end

def user_params
    params.require(:user).permit(:name, :email)
end

Параметры теперь содержат поле для team_id, которое не является атрибутом модели User, поэтому создание не удается. Я не уверен, как решить эту проблему, не говоря уже о том, является ли это подходящим подходом к этому. Любой совет будет принят с благодарностью!


person Alex P    schedule 29.08.2015    source источник
comment
Если пользователь принадлежит команде, у него должен быть team_id, так как own_to находится на стороне с внешним ключом? Также вам не нужны fields_for, если вы не делаете что-то с вложенными атрибутами.   -  person Doon    schedule 30.08.2015
comment
Извините, я не совсем осознавал, как на самом деле работает ассоциация own_to, вы правы. Спасибо!   -  person Alex P    schedule 02.09.2015


Ответы (2)


Добро пожаловать в Rails :)

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

Итак, сначала вам нужно убедиться, что team_id существует в пользовательской модели. И, во-вторых, как предложил Дун, вам не нужно fields_for, если только вы не хотите взаимодействовать с моделью команды и вносить изменения из той же самой формы.

Поэтому сначала создайте миграцию rails g migration add_team_to_user team:belongs_to

при использовании принадлежности_to в вашей миграции будет добавлена ​​ссылка, о которой вы можете узнать здесь: http://edgeguides.rubyonrails.org/active_record_migrations.html

Затем перенесите базу данных bundle exec rake db:migrate

и перезапустите свой сервер. Затем измените форму следующим образом:

<% form_for @user, url: {action: "create"} do |f| %>
  <%= f.text_field :name %>
  <%= f.text_field :email %>
  <%= f.collection_select(:team_id, Team.all, :id, :name) %>

  <%= f.submit %>
<% end %>
person trh    schedule 30.08.2015

легко сделать это, используя гем https://github.com/plataformatec/simple_form

Ассоциации

Чтобы иметь дело с ассоциациями, Simple Form может генерировать выбранные входы, ряд переключателей или флажков. Давайте посмотрим, как это работает: представьте, что у вас есть модель пользователя, которая принадлежит компании и имеет_и_принадлежит_к_многим ролям. Структура будет примерно такой:

class User < ActiveRecord::Base
  belongs_to :company
  has_and_belongs_to_many :roles
end

class Company < ActiveRecord::Base
  has_many :users
end

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users
end

Теперь у нас есть форма пользователя:

<%= simple_form_for @user do |f| %>
  <%= f.input :name %>
  <%= f.association :company %>
  <%= f.association :roles %>
  <%= f.button :submit %>
<% end %>
person shanks    schedule 31.08.2015