Hi, That is what happens now in models/controller_action.rb

    def initialized_interactions() # this is the key method
      [].tap do |o|
        Role.all.each do |r|
          if p = interactions.find { |p| p.role_id == r.id }
            o << p.tap { |p| p.enable ||= true }
          else
            o << Interaction.new(:role_id => r.id)
          end
        end
      end
    end

In rails 3.2 it just works.  What should I return instead of an array ?

On Sunday, 24 March 2013 12:20:49 UTC, jle...@socit.co.uk wrote:
>
> Hi all, I am trying to reproduce rails 3.2 behaviour with fields_for and 
> nested attributes.
>
>     class ControllerAction < ActiveRecord::Base
>       has_many :interactions, dependent: :destroy
>       has_many :roles, through: :interactions
>
>       scope :controllers, lambda {|name| where("controller_name_id = ?", 
> name)}
>       scope :actions, lambda {|name| where("action_name_id = ?", name)}
>
>       def initialized_interactions() # this is the key method
>         [].tap do |o|
>           Role.all.each do |r|
>             if p = interactions.find { |p| p.role_id == r.id }
>               o << p.tap { |p| p.enable ||= true }
>             else
>               o << Interaction.new(:role_id => r.id)
>             end
>           end
>         end
>       end
>     end
>
>     class Role < ActiveRecord::Base
>       has_many :interactions
>     end
>
>     class Interaction < ActiveRecord::Base
>       belongs_to :controller_action
>       belongs_to :role
>       attr_accessor :enable # nice little thingy here
>       # It is now recommended to use strong params instead of   
> 'attr_accessible :enable, :controller_action_id, :role_id'
>     end
>
> controller_actions_controller.rb
>     ...
>       private
>         # Use callbacks to share common setup or constraints between 
> actions.
>         def set_controller_action
>           @controller_action = ControllerAction.find(params[:id])
>         end
>
>         # Never trust parameters from the scary internet, only allow the 
> white list through.
>         def controller_action_params
>           params.require(:controller_action).permit!
>         end
>
> controller_actions view - excluding error code and most css formatting.
> _form.rb
>
>     <%= form_for(@controller_action) do |f| %>
>       ...
>       <%= f.label :name %><br />
>       <%= f.text_field :name %>
>       
>       <h2><%= f.label :role %></h2>
>       <%= f.fields_for :interactions, 
> @controller_action.initialized_interactions() do |builder| %>
>           <% role = builder.object.role %>
>           <%= builder.hidden_field :role_id %>
>
>           <%= builder.check_box :enable %>
>           <%= builder.label :enable, role.name %>
>  
>       <% end %>
>
>       <%= f.submit %>
>
>     <% end %>
>
> Under rails 3.2.11 I get a form that allows the user to edit roles.
> Editing controller_action 
> Name
>   Roles 
>  Webmaster 
>  Admin 
>  Moderator 
>  Editor 
>  Registered User 
>  Guest 
>   Show <http://localhost:3200/controller_actions/1> | 
> Back<http://localhost:3200/controller_actions>
>
> Under Rails 4.0 you get:-
>
> undefined method `role' for #<Array:0xb875d4c>
>
>  Extracted source (around line *#21*):
>    
> 18192021222324
>           
>         <div>
>          <h2><%= f.label :role %></h2>
>          <%= f.fields_for :interactions, 
> @controller_action.initialized_interactions() do |builder| %>
>              <% role = builder.object.role %>
>              <%= builder.hidden_field :role_id %>
>                 <div class="field">
>
>    Trace of template inclusion: app/views/controller_actions/edit.html.erb
>
> Rails.root: /home/john/RubyMineProjects/Rails/4.0/urps2
>  Application Trace <http://localhost:3100/controller_actions/1/edit#> | 
> Framework 
> Trace <http://localhost:3100/controller_actions/1/edit#> | Full 
> Trace<http://localhost:3100/controller_actions/1/edit#> 
>
> app/views/controller_actions/_form.html.erb:21:in `block (2 levels) in 
> _app_views_controller_actions__form_html_erb__366592963_95670400'
> actionpack (4.0.0.beta1) lib/action_view/helpers/capture_helper.rb:38:in 
> `block in capture'
> actionpack (4.0.0.beta1) lib/action_view/helpers/capture_helper.rb:200:in 
> `with_output_buffer'
> actionpack (4.0.0.beta1) lib/action_view/helpers/capture_helper.rb:38:in 
> `capture'
> actionpack (4.0.0.beta1) lib/action_view/helpers/form_helper.rb:707:in 
> `fields_for'
> actionpack (4.0.0.beta1) lib/action_view/helpers/form_helper.rb:1501:in 
> `fields_for'
> app/views/controller_actions/_form.html.erb:20:in `block in 
> _app_views_controller_actions__form_html_erb__366592963_95670400'
> actionpack (4.0.0.beta1) lib/action_view/helpers/capture_helper.rb:38:in 
> `block in capture'
> actionpack (4.0.0.beta1) lib/action_view/helpers/capture_helper.rb:200:in 
> `with_output_buffer'
> actionpack (4.0.0.beta1) lib/action_view/helpers/capture_helper.rb:38:in 
> `capture'
> actionpack (4.0.0.beta1) lib/action_view/helpers/form_helper.rb:435:in 
> `form_for'
> app/views/controller_actions/_form.html.erb:1:in 
> `_app_views_controller_actions__form_html_erb__366592963_95670400'
> actionpack (4.0.0.beta1) lib/action_view/template.rb:143:in `block in render'
> activesupport (4.0.0.beta1) lib/active_support/notifications.rb:160:in 
> `instrument'
> actionpack (4.0.0.beta1) lib/action_view/template.rb:141:in `render'
> actionpack (4.0.0.beta1) lib/action_view/renderer/partial_renderer.rb:306:in 
> `render_partial'
> actionpack (4.0.0.beta1) lib/action_view/renderer/partial_renderer.rb:279:in 
> `block in render'
> actionpack (4.0.0.beta1) lib/action_view/renderer/abstract_renderer.rb:23:in 
> `block in instrument'
> activesupport (4.0.0.beta1) lib/active_support/notifications.rb:158:in `block 
> in instrument'
> activesupport (4.0.0.beta1) 
> lib/active_support/notifications/instrumenter.rb:20:in `instrument'
> activesupport (4.0.0.beta1) lib/active_support/notifications.rb:158:in 
> `instrument'
> actionpack (4.0.0.beta1) lib/action_view/renderer/abstract_renderer.rb:23:in 
> `instrument'
> actionpack (4.0.0.beta1) lib/action_view/renderer/partial_renderer.rb:278:in 
> `render'
> actionpack (4.0.0.beta1) lib/action_view/renderer/renderer.rb:41:in 
> `render_partial'
> actionpack (4.0.0.beta1) lib/action_view/helpers/rendering_helper.rb:27:in 
> `render'
> app/views/controller_actions/edit.html.erb:3:in 
> `_app_views_controller_actions_edit_html_erb__785330494_92185850'
> actionpack (4.0.0.beta1) lib/action_view/template.rb:143:in `block in render'
> activesupport (4.0.0.beta1) lib/active_support/notifications.rb:160:in 
> `instrument'
> actionpack (4.0.0.beta1) lib/action_view/template.rb:141:in `render'
> actionpack (4.0.0.beta1) lib/action_view/renderer/template_renderer.rb:49:in 
> `block (2 levels) in render_template'
> actionpack (4.0.0.beta1) lib/action_view/renderer/abstract_renderer.rb:23:in 
> `block in instrument'
> activesupport (4.0.0.beta1) lib/active_support/notifications.rb:158:in `block 
> in instrument'
> activesupport (4.0.0.beta1) 
> lib/active_support/notifications/instrumenter.rb:20:in `instrument'
> activesupport (4.0.0.beta1) lib/active_support/notifications.rb:158:in 
> `instrument'
> actionpack (4.0.0.beta1) lib/action_view/renderer/abstract_renderer.rb:23:in 
> `instrument'
> actionpack (4.0.0.beta1) lib/action_view/renderer/template_renderer.rb:48:in 
> `block in render_template'
> actionpack (4.0.0.beta1) lib/action_view/renderer/template_renderer.rb:56:in 
> `render_with_layout'
> actionpack (4.0.0.beta1) lib/action_view/renderer/template_renderer.rb:47:in 
> `render_template'
> actionpack (4.0.0.beta1) lib/action_view/renderer/template_renderer.rb:17:in 
> `render'
> actionpack (4.0.0.beta1) lib/action_view/renderer/renderer.rb:36:in 
> `render_template'
> actionpack (4.0.0.beta1) lib/action_view/renderer/renderer.rb:17:in `render'
> actionpack (4.0.0.beta1) lib/abstract_controller/rendering.rb:119:in 
> `_render_template'
> actionpack (4.0.0.beta1) lib/action_controller/metal/streaming.rb:219:in 
> `_render_template'
> actionpack (4.0.0.beta1) lib/abstract_controller/rendering.rb:112:in 
> `render_to_body'
> actionpack (4.0.0.beta1) lib/action_controller/metal/rendering.rb:33:in 
> `render_to_body'
> actionpack (4.0.0.beta1) lib/action_controller/metal/renderers.rb:26:in 
> `render_to_body'
> actionpack (4.0.0.beta1) lib/abstract_controller/rendering.rb:97:in `render'
> actionpack (4.0.0.beta1) lib/action_controller/metal/rendering.rb:16:in 
> `render'
> actionpack (4.0.0.beta1) lib/action_controller/metal/instrumentation.rb:41:in 
> `block (2 levels) in render'
> activesupport (4.0.0.beta1) lib/active_support/core_ext/benchmark.rb:5:in 
> `block in ms'
> /home/john/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/benchmark.rb:296:in 
> `realtime'
> activesupport (4.0.0.beta1) lib/active_support/core_ext/benchmark.rb:5:in `ms'
> actionpack (4.0.0.beta1) lib/action_controller/metal/instrumentation.rb:41:in 
> `block in render'
> actionpack (4.0.0.beta1) lib/action_controller/metal/instrumentation.rb:84:in 
> `cleanup_view_runtime'
> activerecord (4.0.0.beta1) 
> lib/active_record/railties/controller_runtime.rb:24:in `cleanup_view_runtime'
> actionpack (4.0.0.beta1) lib/action_controller/metal/instrumentation.rb:40:in 
> `render'
> actionpack (4.0.0.beta1) lib/action_controller/metal/implicit_render.rb:10:in 
> `default_render'
> actionpack (4.0.0.beta1) lib/action_controller/metal/implicit_render.rb:5:in 
> `send_action'
> actionpack (4.0.0.beta1) lib/abstract_controller/base.rb:189:in 
> `process_action'
> actionpack (4.0.0.beta1) lib/action_controller/metal/rendering.rb:10:in 
> `process_action'
> actionpack (4.0.0.beta1) lib/abstract_controller/callbacks.rb:18:in `block in 
> process_action'
> activesupport (4.0.0.beta1) lib/active_support/callbacks.rb:413:in 
> `_run__68927184__process_action__callbacks'
> activesupport (4.0.0.beta1) lib/active_support/callbacks.rb:78:in 
> `run_callbacks'
> actionpack (4.0.0.beta1) lib/abstract_controller/callbacks.rb:17:in 
> `process_action'
> actionpack (4.0.0.beta1) lib/action_controller/metal/rescue.rb:29:in 
> `process_action'
> actionpack (4.0.0.beta1) lib/action_controller/metal/instrumentation.rb:31:in 
> `block in process_action'
> activesupport (4.0.0.beta1) lib/active_support/notifications.rb:158:in `block 
> in instrument'
> activesupport (4.0.0.beta1) 
> lib/active_support/notifications/instrumenter.rb:20:in `instrument'
> activesupport (4.0.0.beta1) lib/active_support/notifications.rb:158:in 
> `instrument'
> actionpack (4.0.0.beta1) lib/action_controller/metal/instrumentation.rb:30:in 
> `process_action'
> actionpack (4.0.0.beta1) lib/action_controller/metal/params_wrapper.rb:245:in 
> `process_action'
> activerecord (4.0.0.beta1) 
> lib/active_record/railties/controller_runtime.rb:18:in `process_action'
> actionpack (4.0.0.beta1) lib/abstract_controller/base.rb:136:in `process'
> actionpack (4.0.0.beta1) lib/abstract_controller/rendering.rb:44:in `process'
> actionpack (4.0.0.beta1) lib/action_controller/metal.rb:196:in `dispatch'
> actionpack (4.0.0.beta1) lib/action_controller/metal/rack_delegation.rb:13:in 
> `dispatch'
> actionpack (4.0.0.beta1) lib/action_controller/metal.rb:232:in `block in 
> action'
> actionpack (4.0.0.beta1) lib/action_dispatch/routing/route_set.rb:78:in `call'
> actionpack (4.0.0.beta1) lib/action_dispatch/routing/route_set.rb:78:in 
> `dispatch'
> actionpack (4.0.0.beta1) lib/action_dispatch/routing/route_set.rb:46:in `call'
> actionpack (4.0.0.beta1) lib/action_dispatch/journey/router.rb:69:in `block 
> in call'
> actionpack (4.0.0.beta1) lib/action_dispatch/journey/router.rb:57:in `each'
> actionpack (4.0.0.beta1) lib/action_dispatch/journey/router.rb:57:in `call'
> actionpack (4.0.0.beta1) lib/action_dispatch/routing/route_set.rb:651:in 
> `call'
> rack (1.5.2) lib/rack/etag.rb:23:in `call'
> rack (1.5.2) lib/rack/conditionalget.rb:25:in `call'
> rack (1.5.2) lib/rack/head.rb:11:in `call'
> actionpack (4.0.0.beta1) 
> lib/action_dispatch/middleware/params_parser.rb:27:in `call'
> actionpack (4.0.0.beta1) lib/action_dispatch/middleware/flash.rb:241:in `call'
> rack (1.5.2) lib/rack/session/abstract/id.rb:225:in `context'
> rack (1.5.2) lib/rack/session/abstract/id.rb:220:in `call'
> actionpack (4.0.0.beta1) lib/action_dispatch/middleware/cookies.rb:452:in 
> `call'
> activerecord (4.0.0.beta1) lib/active_record/query_cache.rb:36:in `call'
> activerecord (4.0.0.beta1) 
> lib/active_record/connection_adapters/abstract/connection_pool.rb:632:in 
> `call'
> activerecord (4.0.0.beta1) lib/active_record/migration.rb:348:in `call'
> actionpack (4.0.0.beta1) lib/action_dispatch/middleware/callbacks.rb:29:in 
> `block in call'
> activesupport (4.0.0.beta1) lib/active_support/callbacks.rb:373:in 
> `_run__125207171__call__callbacks'
> activesupport (4.0.0.beta1) lib/active_support/callbacks.rb:78:in 
> `run_callbacks'
> actionpack (4.0.0.beta1) lib/action_dispatch/middleware/callbacks.rb:27:in 
> `call'
> actionpack (4.0.0.beta1) lib/action_dispatch/middleware/reloader.rb:64:in 
> `call'
> actionpack (4.0.0.beta1) lib/action_dispatch/middleware/remote_ip.rb:76:in 
> `call'
> actionpack (4.0.0.beta1) 
> lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
> actionpack (4.0.0.beta1) 
> lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
> railties (4.0.0.beta1) lib/rails/rack/logger.rb:38:in `call_app'
> railties (4.0.0.beta1) lib/rails/rack/logger.rb:21:in `block in call'
> activesupport (4.0.0.beta1) lib/active_support/tagged_logging.rb:67:in `block 
> in tagged'
> activesupport (4.0.0.beta1) lib/active_support/tagged_logging.rb:25:in 
> `tagged'
> activesupport (4.0.0.beta1) lib/active_support/tagged_logging.rb:67:in 
> `tagged'
> railties (4.0.0.beta1) lib/rails/rack/logger.rb:21:in `call'
> actionpack (4.0.0.beta1) lib/action_dispatch/middleware/request_id.rb:21:in 
> `call'
> rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
> rack (1.5.2) lib/rack/runtime.rb:17:in `call'
> activesupport (4.0.0.beta1) 
> lib/active_support/cache/strategy/local_cache.rb:72:in `call'
> rack (1.5.2) lib/rack/lock.rb:17:in `call'
> actionpack (4.0.0.beta1) lib/action_dispatch/middleware/static.rb:64:in `call'
> railties (4.0.0.beta1) lib/rails/engine.rb:510:in `call'
> railties (4.0.0.beta1) lib/rails/application.rb:96:in `call'
> railties (4.0.0.beta1) lib/rails/railtie/configurable.rb:30:in 
> `method_missing'
> unicorn (4.6.2) lib/unicorn/http_server.rb:552:in `process_client'
> unicorn (4.6.2) lib/unicorn/http_server.rb:632:in `worker_loop'
> unicorn (4.6.2) lib/unicorn/http_server.rb:500:in `spawn_missing_workers'
> unicorn (4.6.2) lib/unicorn/http_server.rb:511:in `maintain_worker_count'
> unicorn (4.6.2) lib/unicorn/http_server.rb:277:in `join'
> unicorn (4.6.2) bin/unicorn_rails:209:in `<top (required)>'
> /home/john/.rvm/gems/ruby-2.0.0-p0@rails-4/bin/unicorn_rails:23:in `load'
> /home/john/.rvm/gems/ruby-2.0.0-p0@rails-4/bin/unicorn_rails:23:in `<top 
> (required)>'
> ruby-debug-ide (0.4.17.beta16) lib/ruby-debug-ide.rb:86:in `debug_load'
> ruby-debug-ide (0.4.17.beta16) lib/ruby-debug-ide.rb:86:in `debug_program'
> ruby-debug-ide (0.4.17.beta16) bin/rdebug-ide:109:in `<top (required)>'
> -e:1:in `load'
> -e:1:in `<main>'
>
>  Request 
>
> *Parameters*:
>
> {"id"=>"1"}
>
>  Toggle session dump <http://localhost:3100/controller_actions/1/edit#>
>  Toggle env dump <http://localhost:3100/controller_actions/1/edit#>
>  Response 
>
> *Headers*:
>
> None
>
>
> Sorry about the verbosity but I am really struggling to solve this most 
> basic use case.
>
> I have tried to figure out why the form builder returns an array but and 
> would write my own if I could figure out how to.
>
> Any help appreciated. 
>

-- 
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/msg/rubyonrails-talk/-/dy2vSEUnoA4J.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to