【问题标题】:How to get fields_for to create new objects and many-to-many relationships simultaneously?如何让 fields_for 同时创建新对象和多对多关系?
【发布时间】:2011-08-31 09:18:20
【问题描述】:

我一直在关注这些 Railscasts 并尝试修改代码以使其适用于 Rails 3:

http://railscasts.com/episodes/73-complex-forms-part-1

http://railscasts.com/episodes/73-complex-forms-part-2

http://railscasts.com/episodes/73-complex-forms-part-3

我正在尝试同时创建组、用户和成员资格(多对多关系)。人们可以在创建组时将用户添加到组,然后我希望它路由到包含所有成员的组视图。我可以很好地创建会员资格,但在创建用户并将他们与组关联时遇到了麻烦。我的代码目前如下所示:

Group.rb

class Group < ActiveRecord::Base
  has_many :memberships
  has_many :users, :through => :memberships

  attr_accessible :group_name

  def user_attributes=(user_attributes)
    user_attributes.each do |attributes|
      users.build(attributes)
    end
  end
end

Membership.rb

class Membership < ActiveRecord::Base
  belongs_to :groups
  belongs_to :users
end

用户.rb

class User < ActiveRecord::Base
  has_many :memberships
  has_many :groups, :through => :memberships
end

groups_controller.rb

class GroupsController < ApplicationController
  def create #todo test for number of groups they're already in before creation
    @group = Group.new(params[:group])
    @group.memberships.build(:user_id => current_user.id)
    #@group..build

    respond_to do |format|
      if @group.save
        format.html { redirect_to(@group, :notice => 'Group was successfully created and user added...?') }
      else
        format.html { render :action => "new" }
      end
    end
  end
end

我的表单如下所示:

创建者:

views/groups/new.html.rb

<h1>New group</h1>

<%= form_for(@group) do |f| %>
<fieldset>
  <legend>Create a new group</legend>
  <%= render 'shared/group_error_messages', :object => f.object %>  
  <div class="clearfix">
    <%= f.label :group_name %>
    <div class="input">
      <%= f.text_field :group_name %>
    </div>
  </div>

  <div id="users">
    <%= render :partial => 'user', :collection => @group.users %>
  </div>

</div>
<p><%= add_user_link "Add a member" %></p>


<div class="actions">
  <%= f.submit :value => 'Create your group', :class => 'btn success'%>

  <!-- todo test for if they already have a group...-->
</div>
</fieldset>
<% end %>

views/groups/_user.html.rb

<div class="user">
  <%= fields_for :user do |f| %>
    <div class="clearfix">
    <%= f.label :name %>
    <div class="input">
      <%= f.text_field :name %>
    </div>
  </div>
  <div class="clearfix">
    <%= f.label :number %>  
    <div class="input">
      <%= f.text_field :number %>
    </div>
  </div>
  <%= link_to_function "remove", "$(this).up('.user').remove()" %>
  <% end %>
</div>

非常感谢非常非常提前:)

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 many-to-many fields-for


    【解决方案1】:

    你偶然发现了一个看起来相当过时的 Railscast。有些年龄很好......这个没有那么多。您正在寻找的是在 rails 2.3 中引入的 accepts_nested_attributes_for

    组模型:

    #app/models/group.rb
    class Group < ActiveRecord::Base
      has_many :memberships
      has_many :users, :through => :memberships
    
      accepts_nested_atrributes_for :users
    end
    

    组控制器:

    #app/controllers/groups_controller.rb
    Class GroupsController < ApplicationController
      def create
        @group = Group.new(params[:group)
        @group.save ? redirect_to(@group) : render("new")
      end
    end
    

    新组操作:

      <!-- Giving you the important changes only -->
      <div id="users">
        <%= render :partial => 'user', :collection => @group.users, :locals => { :form => f } %>
      </div>
    

    用户部分:

    <div class="user">
      <%= form.fields_for :user do |f| %>
    

    作为一般经验法则,您应该为表单块变量使用更具描述性的名称,尤其是嵌套表单。

    【讨论】:

    • 嗨帕特里克。非常感谢您的回答。我更改了块变量的名称并将部分变量带入主窗体以进行测试。我收到此错误:由 GroupsController#create 作为 HTML 参数处理:{"utf8"=>"✓", "authenticity_token"=>"1Z9IUg7pkg4Xqxa97TI0iqHiUOJNAdqLb04P5iyuKMY=", "group"=>{"group_name"=>"asdfasdf" , "user"=>{"user_name"=>"happy", "user_number"=>"07777888995"}}, "commit"=>"Create your group"} 警告:无法批量分配受保护的属性:用户AREL (0.4ms) INSERT INTO "groups" ("group_name", "cre
    • 您可能需要使用“attr_protected”将 app/models/group.rb 中的某些字段列入黑名单,而不是使用“attr_accessible”将其列入白名单。嵌套属性似乎受到了意外保护。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    相关资源
    最近更新 更多