blakeyoder
blakeyoder

Reputation: 157

Rails 4 Permitted Params with nested attributes

Alright, been looking everywhere for this one. Tried all the solutions. Maybe someone can help on this.

So, I have a WebRequest model that has many WebSites. Each WebSite belongs to a WebRequest. My problem is in the nested form. Ive gone in an permitted the params (atleast, based on the documentation I have) and everything works fine until I go into the server logs. Posted below

class WebRequest < ActiveRecord::Base
  has_many :web_sites
  accepts_nested_attributes_for :web_sites
end

and here is the WebSite model

 class WebSite < ActiveRecord::Base
   belongs_to :web_request, dependent: :destroy
 end

_form.html.erb

<% 1.times do %>
<%= f.fields_for :web_site do |ff| %>
    <%= ff.input :url %>
    <%= ff.input :description %>
  <% end %>
<% end %>

WebRequests Controller

class WebRequestsController < ApplicationController

 def new
   @web_request = WebRequest.new
   # @web_request.web_sites.build
 end

 def index
   @web_requests = WebRequest.all
  end

 def create
    @web_request = WebRequest.new(web_request_params)

respond_to do |format|
  if @web_request.save
    RequestMailer.web_request_submit(@web_request).deliver
    format.html { render partial: 'success' }
    format.json { render action: 'show', status: :created, location: @web_request }
  else
    format.html { render action: 'new' }
    format.json { render json: @web_request.errors, status: :unprocessable_entity }
  end
 end
end

 def web_request_params
   params.require(:web_request).permit(:web_needs, :primary_goal, :secondary_goal,       :    :call_to_action, :hero_image, :image_count, :existing, :resources, :web_examples, :special_functions, :social_network, web_sites_attributes: [:id, :url, :description])
 end
end

And here is the server log:

     Started POST "/web_requests" for 127.0.0.1 at 2014-07-10 15:56:12 -0400
     Processing by WebRequestsController#create as HTML
     Parameters: {"utf8"=>"✓",          "authenticity_token"=>"0iisNgGk/AhC4jRrp1cmKWVCBsCcSx5G2dueEI/+p2A=", "web_request"=>{"web_needs"=>"", "primary_goal"=>"", "secondary_goal"=>"", "call_to_action"=>"", "hero_image"=>"", "image_count"=>"", "existing"=>"", "web_site"=>{"url"=>"TROLL", "description"=>"TROLL"}, "resources"=>"", "special_functions"=>"", "social_network"=>""}, "commit"=>"Create Web request"}
     Unpermitted parameters: web_site

Notice at how the form fields get passed but they get restricted out of making it to the DB.

THANKS!

Update::

Here is the full form path:

  <%= simple_form_for(@web_request) do |f| %>
    <% if @web_request.errors.any? %>
      <div id="error_explanation">
     <h2><%= pluralize(@web_request.errors.count, "error") %>
    prohibited this Web Request from being saved:</h2>
     <ul>
        <% @web_request.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
          <% end %>
          </ul>
          </div>
        <% end %>
      <div class="container">
         <div class="field">
            <%= f.input :web_needs, label: 'What web needs do you have?' %>
    </div>
   <div class="container"><h5>Please list below 5 URL's and explanations of why you like them.</h5></div>
    <% 1.times do %>
     <%= f.fields_for :web_sites do |ff| %>
        <div class="field">
         <%= ff.input :url, label: "URL of example site" %>
        </div>
        <div class="field">
         <%= ff.input :description, label: "Description of example site" %>
        </div>
       <% end %>
      <% end %>
     <div class="field">
      <%= f.input :resources, label: 'Will you be providing any kind of resource on this page? e.g. chord chart download.' %></br>
      </div>
     </div>
     <div class="actions">
       <%= f.button :submit, :class => "button" %>
     </div>
     </div>
   <% end %>

Update::Full error log

   undefined method `url' for #<ActiveRecord::Associations::CollectionProxy []>

The line is here

   <% 1.times do %>
   <%= f.simple_fields_for :web_site, @web_request.web_sites do |ff| %>
     <div class="field">
      <%= ff.input :url, label: "URL of example site" %> <--ERROR HERE on ':url'
     </div>
     <div class="field">
      <%= ff.input :description, label: "Description of example site" %>
     </div>
  <% end %>

Upvotes: 1

Views: 295

Answers (2)

Roman Kiselenko
Roman Kiselenko

Reputation: 44380

Add to controller in new action:

def new
  @web_request = WebRequest.new
  @web_site = @web_request.web_sites.build
end

and form:

<%= f.simple_fields_for @web_site do |ff| %>
    <%= ff.input :url %>
    <%= ff.input :description %>
  <% end %>
<% end %>

and web_request_params:

def web_request_params
   params.require(:web_request).permit(:web_needs,
                                       :primary_goal, 
                                       :secondary_goal, 
                                       :call_to_action,
                                       :hero_image,
                                       :image_count,
                                       :existing,
                                       :resources,
                                       :web_examples,
                                       :special_functions,
                                       :social_network,
                                       { web_sites: [:id, :url, :description] })
 end

Upvotes: 2

Aguardientico
Aguardientico

Reputation: 7779

  1. In your controller in web_request_params change web_sites_attributes for web_site_attributes
  2. In your controller remove the comment from @web_request.web_sites.build
  3. In your view remove 1.times do
  4. In yor form change f.fields_for :web_sites do |ff| with f.simple_fields_for :web_sites do |ff|

Upvotes: 0

Related Questions