I'm trying to get the Wicked Wizard gem working on my Rails app. Once a user registers for the app (using Devise), they're redirected to this form:
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 %>
I generated a controller called finances_welcome_controller.rb
that handles 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
When I click the submit
button, I'm getting this error:
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
Not sure why the update method hasn't been defined since this is the same syntax that my resource's model is using. The Wicked Wizard gem was successfully implemented on this app.
a method starting find_all_by
will return an array of Active record instances... not just a single one. update
only works on a single instance.
So, either you want to run through all the instances in the array... using an each
- or you want to just fetch the first one using find_by
instead of find_all_by
In the case of finding by an id... I'd recommend changing it to find_by
so:
@finance = Finance.find_by_user_id current_user[:id]
@finance.update_attributes(params[:finance])