2

我正在尝试让 Wicked Wizard gem 在我的 Rails 应用程序上运行。一旦用户注册了应用程序(使用 Devise),他们就会被重定向到这个表单:

收入.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 gem 已在此应用程序上成功实现。

4

1 回答 1

1

一个方法开始find_all_by将返回一个活动记录实例的数组......而不仅仅是一个。update仅适用于单个实例。

所以,要么你想遍历数组中的所有实例......使用each- 或者你只想获取第一个使用find_by而不是find_all_by

在通过 id 查找的情况下...我建议将其更改为find_by

@finance = Finance.find_by_user_id current_user[:id]
@finance.update_attributes(params[:finance])
于 2014-03-26T00:14:46.537 回答