I am having a bad time trying to get some form parameters (via a simple 
form, latest version), stored in an integer array in a PostgreSQL table. I 
have abstracted the key parts below, but if anyone would like to poke 
around, I have hosted the project on GitHub: 
https://github.com/cjbutcher/avc_risk_manager_2. Any help much appreciated, 
I have wrestled with this problem for days!

I am building a risk management app. A new risk should accept an integer 
from the 'impact' and 'likelihood' fields on the form view and insert them 
into arrays in the risk table. At the moment, all fields on the new/edit 
risk form update correctly, except impact and likelihood (the arrays). If I 
enter values in these fields, no error is thrown, yet they are not updated.

Here is the code for the form. I don't think the problem lies here, but 
here it is anyway:

app/views/shared/_risk_form.html.erb

<%= simple_form_for(@risk) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="form-group">
    <%= f.input :title, required: false, :error => false, input_html: { 
class: 'form-control' } %>
  </div>

  <div class="form-group">
    <%= f.input :description, required: false, :error => false,  as: :text, 
input_html: { class: 'form-control description' } %>
  </div>

  <div class="form-group">
  <%= f.input :area, :collection => ['Operations', 'IT', 'Finance'], 
required: false, :error => false, input_html: { class: 'form-control' } %>
  </div>

  <div class="form-group">
  <%= f.input :owner, :collection => User.all, required: false, :error => 
false, input_html: { class: 'form-control' } %>
  </div>

  <div class="form-group">
  <%= f.input :action, required: false, :error => false, input_html: { 
class: 'form-control' } %>
  </div>

  <div class="form-inline">
  <span class="date-of-action-input">
  <%= f.input :date_of_action, as: :date, :start_year => Date.today.year - 
10, :end_year => 2030,
   :order => [ :day, :month, :year], :required => false, :error => false, 
input_html: { class: 'form-control' } %>
  </span>
  <span class="action-completed-input">
  <%= f.input :action_completed, as: :boolean, required: false, :error => 
false, input_html: { class: 'form-control' } %>
    </span>

  <span class="impact-input">
  <%= f.input :impact, required: false, :error => false, input_html: { 
class: 'form-control' } %>
  </span>
  <span class="likelihood-input">
  <%= f.input :likelihood, required: false, :error => false, input_html: { 
class: 'form-control' } %>
  </span>
  <span class="submit-risk">
  <%= f.button :submit, :error => false, :error => false, input_html: { 
class: 'form-control' } %>
  </span>
  </div>
<% end %>

Here is the controller, note the strong params for impact and likelihood:

app/controllers/risk_controller.rb

class RisksController < ApplicationController
before_action :signed_in_user
before_action :correct_user, only: [:destroy, :update]


def create
@risk = current_user.risks.build(risk_params)
    if @risk.save
      flash[:success] = "Risk created!"
      redirect_to root_url
    else
      render 'new'
    end
end

def new
  @risk = Risk.new
end

def destroy
  @risk.destroy
  redirect_to root_url
end

def edit
  @risk = Risk.find(params[:id])
end

def update
  @risk = Risk.find(params[:id])
    @risk.assign_attributes(risk_params)
    if @risk.changed? == false
      flash[:info] = "No changes were made"
      redirect_to root_url
    elsif @risk.update_attributes(risk_params)
      flash[:success] = "The risk has been updated."
      redirect_to root_url
    else
        render 'new'
    end
end

private

def risk_params
params.require(:risk).permit(:description, :title, :area, :owner, :action, 
:date_of_action, :action_completed, { :impact => [] }, { :likelihood => [] 
})
end

  def correct_user
    if current_user.admin?
      @risk = Risk.find_by(id: params[:id])
      redirect_to root_url if @risk.nil?
    else
      @risk = current_user.risks.find_by(id: params[:id])
      redirect_to root_url if @risk.nil?
    end
  end

end

Here is the model. I purposefully left validations off the impact and 
likelihood fields for now so I don't have to worry about that being the 
problem:

app/models/risk.rb

class Risk < ActiveRecord::Base
belongs_to :user
validates :user_id, presence: true
validates :description, presence: true
validates :title, presence: true
validates :area, presence: true
validates :owner, presence: true
end

Finally, here is the db schema:

app/db/schema.rb

ActiveRecord::Schema.define(version: 20140622153923) do

  # These are extensions that must be enabled in order to support this 
database
  enable_extension "plpgsql"

  create_table "risks", force: true do |t|
    t.integer  "user_id"
    t.string   "description"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "title"
    t.string   "area"
    t.string   "owner"
    t.string   "action"
    t.date     "date_of_action"
    t.boolean  "action_completed", default: false
    t.integer  "impact",           default: [],    array: true
    t.integer  "likelihood",       default: [],    array: true
  end

  add_index "risks", ["user_id", "created_at"], name: 
"index_risks_on_user_id_and_created_at", using: :btree

  create_table "users", force: true do |t|
    t.string   "name"
    t.string   "email"
    t.boolean  "admin",           default: false
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "password_digest"
    t.string   "remember_token"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true, 
using: :btree
  add_index "users", ["remember_token"], name: 
"index_users_on_remember_token", using: :btree

end

Any help much appreciated! If there is any extra information I can provide 
please let me know.

Thanks v much, Chris

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-talk+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/40d0611e-1b4c-4c98-8d66-342b9f28fbb2%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to