【问题标题】:Rails Forms with Nested Attributes from Join Model many_to_many来自 Join Model many_to_many 的具有嵌套属性的 Rails 表单
【发布时间】:2014-04-30 21:53:53
【问题描述】:

我有两个问题:

-我坚持创建一个项目,其中包含 :position 的嵌套属性

-我几乎可以使用它来编辑项目详细信息以及 :position 属性,但是 fields_for :assigned_projects 会为分配给该项目的所有用户广告所有字段。

我有 3 个模型:

class User < ActiveRecord::Base
  has_many :assigned_projects
  has_many :projects, :through => :assigned_projects

  has_many :created_projects, :class_name => "Project", :foreign_key => :creator_id
end

class Project < ActiveRecord::Base
  belongs_to :user
  has_many :assigned_projects
  has_many :users, :through => :assigned_projects
  belongs_to :creator, :class_name => "User", :foreign_key => :creator_id

  attr_accessible :name, :controlled, :currency, :creator_id, :assigned_projects  
  accepts_nested_attributes_for :assigned_projects#, :allow_destroy => true
end

class AssignedProject < ActiveRecord::Base
  belongs_to :user,    class_name: "User"
  belongs_to :project, class_name: "Project"

  attr_accessible :project_id, :user_id, :position, :project, :user, :user_attributes
  accepts_nested_attributes_for :user
end

每个用户都可以创建一个项目并且是 Projects.creator 每个Project通过join模型Assigned_Project拥有_many Users

每个用户在项目中可以有不同的位置,所以我想将 :position 保存在连接模型 AssignedProject 中。

如果用户创建了一个项目,他应该能够编辑项目属性以及新连接模型的 :position 属性。

现在是 New.Project 和 Edit.Project 的表单字段

/project/new.htm.erb

<%= form_for( setup_new_project(@project) ) do |f| %>

    <%= f.label :name %>
    <%= f.text_field :name %>

    <%= f.fields_for :assigned_projects do |ff| %>
        <%= ff.label :position %>
        <%= ff.text_field :position%>
    <% end %>

    <%= f.submit "Add Project", class: "" %>                    
<% end %>


/project/edit.htm.erb

<%= form_for( setup_project(current_project) ) do |f| %>

    <%= f.label :name %>
    <%= f.text_field :name %>

    <%= f.fields_for :assigned_projects do |ff| %>
        <%= ff.label :position %>
        <%= ff.text_field :position%>
    <% end %>

    <%= f.submit "Update Project", class: "" %>
<% end %>

并且我有本文所述的以下设置方法: http://www.sitepoint.com/complex-rails-forms-with-nested-attributes/

module FormHelper
    def setup_project(project)
        project.assigned_projects ||= AssignedProject.new
        project
    end

    def setup_new_project(project)
        project.assigned_project = AssignedProject.new
        project
    end

end

我希望问题足够清楚。

对于创建一个新项目,当前的错误信息是:

undefined method `assigned_project='

15:             <%= render 'shared/user_sidebar_menu' %>
16: 
17:             <div class="span4 offset1">
18:                 <%= form_for( setup_new_project(@project) ) do |f| %>
19: 
20:                     <%= render 'shared/error_messages', object: f.object %>
21: 

更新:添加了 projects_controller.rb

projects_controller.rb

class ProjectsController < ApplicationController

    def new
        @project = Project.new
    end

    def create
        @project = Project.new(params[:project])
        @project.creator = current_user
        if @project.save
            current_user.assigned_projects.create(project: @project)
            redirect_to current_user
        else
            render 'new'
        end
    end
end

【问题讨论】:

    标签: ruby-on-rails many-to-many nested-attributes


    【解决方案1】:

    更新setup_new_project方法如下:

       def setup_new_project(project)
            project.assigned_projects.build ## Updated this line
            project
        end
    

    使用project.assigned_projects(注意复数)而不是project.assigned_project(注意单数错误)。

    UserAssignedProject 模型处于 1-M 关系中。因此,您得到动态方法 assigned_projects=(Notice plural),当您调用 assigned_project=(Notice singular) 时遇到错误,它不存在。

    更新

    undefined method each for <AssignedProject:0x007ff7aa55b528>
    

    使用project.assigned_projects.build 代替project.assigned_project = AssignedProject.new

    更新 2

    您的处理方法不正确。表单助手完全不需要。您需要做的就是更新newcreate 操作,如下所示:

    def new
        @project = Project.new
        @project.assigned_projects.build
    end
    

    并更新newedit 视图中的form_for 如下:

    <%= form_for(@project) do |f| %> 
    

    【讨论】:

    • 我收到此 undefined method each for &lt;AssignedProject:0x007ff7aa55b528&gt; 错误消息,其中 project.assigned_projects 在 plural 中描述
    • 这意味着assigned_projects 方法正在工作,现在您的代码中遇到了不同的问题。检查我更新的答案,应该可以解决您的问题。
    • 随着您的更新,会出现 :position 字段,但是当您添加无效信息时,会在从 create 方法调用 render 'new' 时出现第二个 :position 字段。我在问题中添加了 projects_controller.rb。
    • 这是一个不同的问题。我的回答解决了您最初的问题undefined method assigned_project='`。接受这个答案,我建议发布一个新问题,因为它是一个完全不同的问题。新问题的出现是因为您构建代码的方式而不是因为我的更新。链接或更改原始问题不是一个好习惯。
    • ok 将发布一个新问题。 :position 字段出现,但不会被保存。表单返回Assigned projects user can't be blank, Assigned projects project can't be blank
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多