У меня есть приложение 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[] из формы счета?

Я вижу их в параметрах запроса, если приложение вылетает:

screenshot

Спасибо за вашу помощь!

PS - я должен делать это в контроллере, а не в модели?

-1
Reddirt 9 Дек 2014 в 19:07
Не ответ, но проверьте accepts_nested_attributes_for именно для таких вещей.
 – 
DickieBoy
9 Дек 2014 в 19:23
DickieBoy - посмотрю - спасибо
 – 
Reddirt
9 Дек 2014 в 19:54

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

Обратите внимание, что эти параметры соответствуют тому, что у вас есть сейчас.

Если вам нужно что-то еще, не стесняйтесь спрашивать.

0
Stan 9 Дек 2014 в 19:55

Не уверен, что это лучший ответ, но я заставил его работать, используя код в контроллере счета вместо модели:

    newinvexpense = Invexpense.new(
        linetype_id: 2,
        invoice_id: @invoice.id,
        expense_id: params[:expense_ids].first.to_i
    )

Приведенный выше код работает только для первого идентификатора в массиве. Я обновлю код для обработки всех идентификаторов в массиве.

0
Reddirt 9 Дек 2014 в 20:52