Неопределенный метод «обновление» для массива

Я пытаюсь заставить жемчужину Wicked Wizard работать в моем приложении Rails. Как только пользователь регистрируется в приложении (используя Devise), он перенаправляется на эту форму:

income.html.erb

<%= form_for @finance, url: wizard_path, :method => :put do |f|  %>
  <div class="field">
    What <strong>year</strong> were you born?<br>
    <%= f.number_field :age %>
  </div>
  <div class="field">
    What's your <strong>zip code</strong>?<br>
    <%= f.number_field :zip %>
  </div>
  <%= f.submit %>
<% end %>

Я сгенерировал контроллер с именем finances_welcome_controller.rb, который обрабатывает wizard_path:

class FinancesWelcomeController < ApplicationController
  before_filter :authenticate_user!
  include Wicked::Wizard
  steps :income, :expenses
  def show
    @finance = Finance.find_all_by_user_id current_user[:id] || @finance =     current_user.finances.build(finance_params)
    render_wizard
  end
  def update
    @finance = Finance.find_all_by_user_id current_user[:id]
    @finance.update(params[:finance])
    render_wizard @finance
  end

Когда я нажимаю кнопку submit, я получаю эту ошибку:

NoMethodError in FinancesWelcomeController#update
undefined method `update' for #<Array:0x00000104c6ff48>
Extracted source (around line #14):
    def update
        @finance = Finance.find_all_by_user_id current_user[:id]
        **@finance.update(params[:finance])**
        render_wizard @finance
    end

Не уверен, почему метод обновления не был определен, поскольку это тот же синтаксис, который использует моя модель ресурса. Жемчужина Wicked Wizard была успешно реализована в этом приложении.


person beaconhill    schedule 26.03.2014    source источник


Ответы (1)


метод, начинающийся с find_all_by, вернет массив экземпляров активной записи... а не один. update работает только с одним экземпляром.

Итак, либо вы хотите просмотреть все экземпляры в массиве... используя each, либо вы хотите просто получить первый экземпляр, используя find_by вместо find_all_by

В случае поиска по идентификатору... Я бы рекомендовал изменить его на find_by, поэтому:

@finance = Finance.find_by_user_id current_user[:id]
@finance.update_attributes(params[:finance])
person Taryn East    schedule 26.03.2014
comment
Спасибо за ответ - кажется, это исправило ошибку отправки формы, но, к сожалению, данные на самом деле не сохраняются. У меня есть пользователи, связанные с финансами, и когда я нажимаю _form для редактирования финансов, данные не обновляются тем, что было отправлено мастером. - person beaconhill; 26.03.2014
comment
@beaconhill - попробуй update_attributes. Или в идеале @finance.assign_attributes(params[:finance]); finance.save! ` - person BroiSatse; 26.03.2014
comment
Это экономит, когда я возвращаюсь на страницу мастера (/finance_welcome/income, которая имеет часть формы), но не когда я нахожусь на странице фактического редактирования финансов (/finance/6/edit) - person beaconhill; 26.03.2014
comment
Вам нужно будет предоставить нам дополнительный код/информацию для просмотра. Ваша форма вызывает действие обновления в вашем контроллере›? какие параметры входят в params[:finance]? это то, что вы ожидаете? так далее - person Taryn East; 27.03.2014