Rails 3 - has_many通过嵌套表单

Ale*_*lex 6 ruby-on-rails ruby-on-rails-3

我正在尝试使用嵌套表单,但在保存时不断收到此错误 -

uninitialized constant User::Userplan
Run Code Online (Sandbox Code Playgroud)

这是我的型号代码 -

用户

class User < ActiveRecord::Base 
  has_many :userplans
  has_many :plans, :through => :userplans
  accepts_nested_attributes_for :userplans
Run Code Online (Sandbox Code Playgroud)

UserPlan

class UserPlan < ActiveRecord::Base
 belongs_to :plan
 belongs_to :user
Run Code Online (Sandbox Code Playgroud)

计划

class Plan < ActiveRecord::Base
 has_many :userplans
 has_many :users, :through => :userplans
Run Code Online (Sandbox Code Playgroud)

形成

<%= form_for(@user) do |f| %>
 <%= hidden_field_tag "user[userplans][plan_id]", 2 %>
 <%= f.text_field :first_name %></p>
Run Code Online (Sandbox Code Playgroud)

我知道使用hidden_​​field_tag是错误的,但我不确定更好的方法

谢谢你的帮助!

activerecord(3.0.3)lib/active_record/associations/association_proxy.rb:260:在raise_on_type_mismatch' activerecord (3.0.3) lib/active_record/associations/association_collection.rb:352:in块中替换'activerecord(3.0.3)lib/active_record/associations/association_collection.rb:352:each' activerecord (3.0.3) lib/active_record/associations/association_collection.rb:352:in替换'activerecord(3.0.3) lib/active_record/associations.rb:1524:在block in collection_accessor_methods' activerecord (3.0.3) lib/active_record/base.rb:1559:inattributes 中的块='activerecord(3.0.3)lib/active_record/base.rb:1555:in each' activerecord (3.0.3) lib/active_record/base.rb:1555:inattributes ='cancan(1.4.1)lib/cancan/controller_resource.rb: 72:在build_resource' cancan (1.4.1) lib/cancan/controller_resource.rb:48:inload_resource_instance中"cancan(1.4.1)lib/cancan/controller_resource.rb:30:在load_resource' cancan (1.4.1) lib/cancan/controller_resource.rb:24:inload_and_authorize_resource中"cancan(1.4.1)lib/cancan/controller_resource.rb:9:在block in add_before_filter' activesupport (3.0.3) lib/active_support/callbacks.rb:436:in运行 _3988671192319902872__process_action_ 982103756142273942 _callbacks'activesupport(3.0. 3)lib/active_support/callbacks.rb:409:在_run_process_action_callbacks' activesupport (3.0.3) lib/active_support/callbacks.rb:93:inrun_callbacks'actionpack(3.0.3)中lib/abstract_controller/callbacks.rb:17:process_action' actionpack (3.0.3) lib/action_controller/metal/instrumentation.rb:30:in在process_action 中的块'activesupport(3.0.3)lib/active_support/notifications.rb: 52:在block in instrument' activesupport (3.0.3) lib/active_support/notifications/instrumenter.rb:21:in仪器'activesupport(3.0.3)lib/active_support/notifications.rb:52:in instrument' actionpack (3.0.3) lib/action_controller/metal/instrumentation.rb:29:inprocess_action'actionpack(3.0.3)lib/action_controller/metal /rescue.rb:17:in process_action' actionpack (3.0.3) lib/abstract_controller/base.rb:120:in进程'actionpack(3.0.3)lib/abstract_controller/rendering.rb:40:在process' actionpack (3.0.3) lib/action_controller/metal.rb:138:indispatch'actionpack(3.0.3)lib/action_controller/metal/rack_delegation.rb:14:in dispatch' actionpack (3.0.3) lib/action_controller/metal.rb:178:inblock in action'actionpack(3.0.3)lib/action_dispatch/routing/route_set.rb:62:in call' actionpack (3.0.3) lib/action_dispatch/routing/route_set.rb:62:indispatch'actionpack(3.0.3)lib/action_dispatch/routing/route_set.rb:27:in call' rack-mount (0.6.13) lib/rack/mount/route_set.rb:148:inblock in call'port -mount( 0.6.13)lib/rack/mount/code_generation.rb:93:在block in recognize' rack-mount (0.6.13) lib/rack/mount/code_generation.rb:75:inoptimized_each'rack-mount(0.6.13)lib/rack/mount/code_generation.rb:92:in call'actionpack recognize' rack-mount (0.6.13) lib/rack/mount/route_set.rb:139:in(3.0.3)lib/action_dispatch/routing/route_set.rb:492:在call' warden (1.0.2) lib/warden/manager.rb:35:in调用块'warden(1.0.2)lib/warden/manager.rb:34:在catch' warden (1.0.2) lib/warden/manager.rb:34:in调用'actionpack(3.0.3)lib/action_dispatch/middleware/best_standards_support.rb: 17:在call' actionpack (3.0.3) lib/action_dispatch/middleware/head.rb:14:in调用'rack(1.2.1)lib/rack/methodoverride.rb:24:在call' actionpack (3.0.3) lib/action_dispatch/middleware/params_parser.rb:21:in调用'actionpack(3.0.3)lib/action_dispatch/middleware/flash.rb:182:在call' actionpack (3.0.3) lib/action_dispatch/middleware/session/abstract_store.rb:149:in调用'actionpack(3.0.3) )lib/action_dispatch/middleware/cookies.rb:295:在call' activerecord (3.0.3) lib/active_record/query_cache.rb:32:in调用块中'activerecord(3.0.3)lib/active_record/connection_adapters/abstract/query_cache.rb:28:in cache' activerecord (3.0.3) lib/active_record/query_cache.rb:12:incache'activerecord(3.0.3)lib/active_record/query_cache.rb:31:in call' activerecord (3.0.3) lib/active_record/connection_adapters/abstract/connection_pool.rb:353:incall'actionpack(3.0.3)lib/action_dispatch/middleware/callbacks.rb:46:in block in call' activesupport (3.0.3) lib/active_support/callbacks.rb:415:in_run_call_callbacks'actionpack(3.0.3)lib/action_dispatch/middleware/callbacks.rb:44:在call' rack (1.2.1) lib/rack/sendfile.rb:107:in调用'actionpack(3.0.3)lib/action_dispatch/middleware/remote_ip.rb:48:在call' actionpack (3.0.3) lib/action_dispatch/middleware/show_exceptions.rb:46:in调用'railties(3.0.3)lib/rails/rack/logger.rb: 13:在call' rack (1.2.1) lib/rack/runtime.rb:17:in调用'activesupport(3.0.3)lib/active_support/cache/strategy/local_cache.rb:72:in call' rack (1.2.1) lib/rack/lock.rb:11:inblock in call':10:in synchronize' rack (1.2.1) lib/rack/lock.rb:11:incall'actionpack(3.0.3)lib/action_dispatch/middleware/static. rb:30:在call' railties (3.0.3) lib/rails/application.rb:168:in调用'railties(3.0.3)lib/rails/application.rb:77:在method_missing' railties (3.0.3) lib/rails/rack/log_tailer.rb:14:in调用'rack(1.2.1)lib/rack/content_length.rb:13:在call' rack (1.2.1) lib/rack/handler/webrick.rb:52:in服务'/ Users/joshcrowder/.rvm/rubies/ruby​​-1.9.2-p0/lib/ruby​​/1.9.1/webrick/httpserver.rb:111:in service' /Users/joshcrowder/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/webrick/httpserver.rb:70:inrun' /Users/joshcrowder/.rvm/rubies/ruby-1.9.2-p0/ lib/ruby​​/1.9.1/webrick/server.rb:183:在`block in start_thread'中

hor*_*irs 2

我认为你的问题在于你的协会的命名。由于您的UserPlan模型是 CamelCased <- 这样,Rails 将其名称“制表”为:user_plans,而不是:userplan。正如您所看到的,您的错误源于 Rails 在应该Userplan寻找 时却无法找到UserPlan

用户:

class User < ActiveRecord::Base 
  has_many :user_plans
  has_many :plans, :through => :user_plans
  accepts_nested_attributes_for :user_plans
Run Code Online (Sandbox Code Playgroud)

计划:

class Plan < ActiveRecord::Base
  has_many :user_plans
  has_many :users, :through => :user_plans
Run Code Online (Sandbox Code Playgroud)

看法:

<%= form_for(@user) do |f| %>
 <%= hidden_field_tag "user[user_plans][plan_id]", 2 %>
 <%= f.text_field :first_name %></p>
Run Code Online (Sandbox Code Playgroud)

关于hidden_field_tag,您究竟想做什么?也许你应该提出另一个问题?

希望这可以帮助!