У меня есть приложение Rails, в котором есть модели: расходы на заказы и счета-фактуры. Для каждого расхода по счету существует запись invexpense.
Заказы могут иметь потомков.
Когда я создаю счет, я хочу иметь возможность выбирать расходы из дочерних элементов для включения в счет. Я надеюсь создать записи invexpense в модели счета-фактуры.
Форма счета-фактуры перечисляет расходы детей в этой таблице:
<% workorder.children.each do |child| %>
<% child.expenses.tobill.each do |expense| %>
<tr>
<td><%= check_box_tag "expense_ids[]", expense.id %></td>
<td><%= child.id_desc %></td>
<td><%= expense.exp_date %></td>
<td><%= expense.description %></td>
<td><%= number_to_currency(expense.amount) %></td>
</tr>
<% end %>
<% end %>
Если пользователь проверяет расход, я хочу создать запись о расходах.
Опять же, я пытаюсь создать эти записи в модели счета-фактуры с помощью такого кода:
invexpenses.build linetype_id: 2, expense_id: expense.id
Но я не знаю, как получить доступ к expense_ids[]
.
Код, который я пробовал:
if self.expense_ids?
if expense_ids?
if expense_ids.count > 0
if params[:expense_ids] ...
Есть ли способ получить доступ к expense_ids[]
из формы счета?
Я вижу их в параметрах запроса, если приложение вылетает:
Спасибо за вашу помощь!
PS - я должен делать это в контроллере, а не в модели?
2 ответа
Чтобы ответить на ваш последний вопрос, да, управление параметрами должно происходить в вашем контроллере. Для вашей формы я уже некоторое время использую 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 %>
После этого в вашем контроллере вы можете получить к нему доступ вот так в хеше children_params
:
def children_params
params.require(:children).permit(:whatever, :another_one, expense_ids: [])
end
Обратите внимание, что эти параметры соответствуют тому, что у вас есть сейчас.
Если вам нужно что-то еще, не стесняйтесь спрашивать.
Не уверен, что это лучший ответ, но я заставил его работать, используя код в контроллере счета вместо модели:
newinvexpense = Invexpense.new(
linetype_id: 2,
invoice_id: @invoice.id,
expense_id: params[:expense_ids].first.to_i
)
Приведенный выше код работает только для первого идентификатора в массиве. Я обновлю код для обработки всех идентификаторов в массиве.
Похожие вопросы
Новые вопросы
ruby-on-rails
Ruby on Rails - это полнофункциональная платформа веб-приложений с открытым исходным кодом, написанная на Ruby. Он следует популярной модели фреймворка MVC и известен своим подходом «соглашение поверх конфигурации» при разработке приложений.