Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在RubyonRails4中从父对象创建嵌套子对象_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 如何在RubyonRails4中从父对象创建嵌套子对象

Ruby on rails 如何在RubyonRails4中从父对象创建嵌套子对象,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我试图在Rails 4中重现一个在Rails 3中运行良好的功能:使用new\u parent\u child\u path(@parent)从其父级的Show视图创建一个子记录 不幸的是,当我验证子项创建时,我收到一条消息说child.parent\u id字段不能为null。环顾四周,这一新的_parent _child _path(@parent)功能似乎确实很少使用。以下是我的部分代码 型号: class BusinessArea < ActiveRecord::Base

我试图在Rails 4中重现一个在Rails 3中运行良好的功能:使用
new\u parent\u child\u path(@parent)
从其父级的Show视图创建一个子记录

不幸的是,当我验证子项创建时,我收到一条消息说
child.parent\u id字段不能为null
。环顾四周,这一新的_parent _child _path(@parent)功能似乎确实很少使用。以下是我的部分代码

型号:

class BusinessArea < ActiveRecord::Base
     ... some checks ...
 validates :playground_id, presence: true
 belongs_to :playground
 belongs_to :owner, :class_name => "User", :foreign_key => "owner_id"       # helps retrieving the owner name
 belongs_to :status, :class_name => "Parameter", :foreign_key => "status_id"    # helps retrieving the status name
 has_many :business_flows
end

class BusinessFlow < ActiveRecord::Base
     ... some checks ...
 validates :playground_id, presence: true
 belongs_to :playground
 belongs_to :owner, :class_name => "User", :foreign_key => "owner_id"       # helps retrieving the owner name
 belongs_to :status, :class_name => "Parameter", :foreign_key => "status_id"    # helps retrieving the status name
 has_many :business_processes
 belongs_to :business_area
end
ODQStep1::Application.routes.draw do

#static pages
get '/help',        to: "static_pages#help"
get '/about',   to: "static_pages#about"
get '/contact',     to: "static_pages#contact"
get '/home',        to: "static_pages#home"

#root definition
root to: "static_pages#home"

resources :sessions, only: [:new, :create, :destroy]  
get '/signin',  to: 'sessions#new'  , via: :get
match '/signout', to: 'sessions#destroy', via: :delete

resources :parameters

resources :business_areas do
     resources :business_flows, :only=>[:new, :create]
end
end
<% provide(:title, 'Managing business areas') %>

  <h1>Business area: <%= @business_area.name %></h1>

  <ul class="mid_menu">
    <li><%= link_to 'Edit', edit_business_area_path(@business_area) %> |</li>
    <li><%= link_to 'Back to list', business_areas_path %> |</li>
    <li><%= link_to 'Destroy', @business_area, confirm: 'Are you sure?', method: :delete %></li>
  </ul>

<!-- <p id="notice"><%= notice %></p> -->

  <div class="tabbable">
    <ul class="nav nav-tabs">
      <li class="active"><a href="#tab1" data-toggle="tab">Definition</a></li>
      <li><a href="#tab2" data-toggle="tab">Ownership</a></li>
    </ul>
    <div class="tab-content">

    <div class="tab-pane active" id="tab1">
<!-- Tab content for Definition -->

      <div class="row">
        <div class="span2 text-right">Name:
        </div>
        <div class="span6"><%= @business_area.name%>
        </div>
        <div class="span1 text-right">Code:
        </div>
        <div class="span1"><%= @business_area.code%>
        </div>
        <div class="span1 text-right">Status:
        </div>
        <div class="span1"><%= @business_area.status.name%>
        </div>
      </div>

      <div class="row">
        <div class="span2 text-right">Description:
        </div>
        <div class="span10"><%= @business_area.description%>
        </div>
      </div>

      <div class="row">
        <div class="span2 text-right">Hierarchy:
        </div>
        <div class="span2"><%= @business_area.hierarchy%>
        </div>
      </div>

      <div class="row">
        <div class="span2 text-right">PCF index:
        </div>
        <div class="span2"><%= @business_area.PCF_index%>
        </div>
        <div class="span2 text-right">PCF reference:
        </div>
        <div class="span2"><%= @business_area.PCF_reference%>
        </div>
      </div>


<!-- Tab content -->
    </div>    

    <div class="tab-pane" id="tab2">
<!-- Tab content for Ownership -->

      <div class="row">
        <div class="span2 text-right">Unique id:
        </div>
        <div class="span2"><%= @business_area.id%>
        </div>
        <div class="span2 text-right">Created by:
        </div>
        <div class="span2"><%= @business_area.created_by%>
        </div>
      </div>
      <div class="row">
        <div class="span2 text-right">Playground id:
        </div>
        <div class="span2"><%= @business_area.playground_id%>
        </div>
        <div class="span2 text-right">Created at:
        </div>
        <div class="span2"><%= @business_area.created_at%>
        </div>
      </div>
      <div class="row">
        <div class="span2 text-right">Owner:
        </div>
        <div class="span2"><%= @business_area.owner.login%>
        </div>
        <div class="span2 text-right">Updated by:
        </div>
        <div class="span2"><%= @business_area.updated_by%>
        </div>
      </div>
      <div class="row">
        <div class="span2 text-right">
        </div>
        <div class="span2">
        </div>
        <div class="span2 text-right">updated at:
        </div>
        <div class="span2"><%= @business_area.updated_at%>
        </div>
      </div>

<!-- Tab content -->
    </div>

    </div>
  </div>

<table width=100%>    
  <tr><td><hr /></td></tr>
  <tr align="left">
    <th>Linked Business Flows</th>
    <th></th>
  </tr>
  <tr>
    <td>
      <table class="table table-striped table-condensed">
        <%@business_area.business_flows.each do |business_flow| %>
        <tr align="left">
          <td valign="top"> <%=link_to business_flow.code, business_flow%> </td>
          <td valign="top"> <%=business_flow.name%> </td>
          <td valign="top"> <%=business_flow.description%> </td>
          <td> </td>
        </tr>
        <% end%>
      </table>
    </td>
  </tr>
  <tr>
    <td>
      <%= link_to 'Add business flow', new_business_area_business_flow_path(@business_area) %>
    </td>
  </tr>
</table>
创建子业务流的链接位于业务区显示视图的末尾:

class BusinessArea < ActiveRecord::Base
     ... some checks ...
 validates :playground_id, presence: true
 belongs_to :playground
 belongs_to :owner, :class_name => "User", :foreign_key => "owner_id"       # helps retrieving the owner name
 belongs_to :status, :class_name => "Parameter", :foreign_key => "status_id"    # helps retrieving the status name
 has_many :business_flows
end

class BusinessFlow < ActiveRecord::Base
     ... some checks ...
 validates :playground_id, presence: true
 belongs_to :playground
 belongs_to :owner, :class_name => "User", :foreign_key => "owner_id"       # helps retrieving the owner name
 belongs_to :status, :class_name => "Parameter", :foreign_key => "status_id"    # helps retrieving the status name
 has_many :business_processes
 belongs_to :business_area
end
ODQStep1::Application.routes.draw do

#static pages
get '/help',        to: "static_pages#help"
get '/about',   to: "static_pages#about"
get '/contact',     to: "static_pages#contact"
get '/home',        to: "static_pages#home"

#root definition
root to: "static_pages#home"

resources :sessions, only: [:new, :create, :destroy]  
get '/signin',  to: 'sessions#new'  , via: :get
match '/signout', to: 'sessions#destroy', via: :delete

resources :parameters

resources :business_areas do
     resources :business_flows, :only=>[:new, :create]
end
end
<% provide(:title, 'Managing business areas') %>

  <h1>Business area: <%= @business_area.name %></h1>

  <ul class="mid_menu">
    <li><%= link_to 'Edit', edit_business_area_path(@business_area) %> |</li>
    <li><%= link_to 'Back to list', business_areas_path %> |</li>
    <li><%= link_to 'Destroy', @business_area, confirm: 'Are you sure?', method: :delete %></li>
  </ul>

<!-- <p id="notice"><%= notice %></p> -->

  <div class="tabbable">
    <ul class="nav nav-tabs">
      <li class="active"><a href="#tab1" data-toggle="tab">Definition</a></li>
      <li><a href="#tab2" data-toggle="tab">Ownership</a></li>
    </ul>
    <div class="tab-content">

    <div class="tab-pane active" id="tab1">
<!-- Tab content for Definition -->

      <div class="row">
        <div class="span2 text-right">Name:
        </div>
        <div class="span6"><%= @business_area.name%>
        </div>
        <div class="span1 text-right">Code:
        </div>
        <div class="span1"><%= @business_area.code%>
        </div>
        <div class="span1 text-right">Status:
        </div>
        <div class="span1"><%= @business_area.status.name%>
        </div>
      </div>

      <div class="row">
        <div class="span2 text-right">Description:
        </div>
        <div class="span10"><%= @business_area.description%>
        </div>
      </div>

      <div class="row">
        <div class="span2 text-right">Hierarchy:
        </div>
        <div class="span2"><%= @business_area.hierarchy%>
        </div>
      </div>

      <div class="row">
        <div class="span2 text-right">PCF index:
        </div>
        <div class="span2"><%= @business_area.PCF_index%>
        </div>
        <div class="span2 text-right">PCF reference:
        </div>
        <div class="span2"><%= @business_area.PCF_reference%>
        </div>
      </div>


<!-- Tab content -->
    </div>    

    <div class="tab-pane" id="tab2">
<!-- Tab content for Ownership -->

      <div class="row">
        <div class="span2 text-right">Unique id:
        </div>
        <div class="span2"><%= @business_area.id%>
        </div>
        <div class="span2 text-right">Created by:
        </div>
        <div class="span2"><%= @business_area.created_by%>
        </div>
      </div>
      <div class="row">
        <div class="span2 text-right">Playground id:
        </div>
        <div class="span2"><%= @business_area.playground_id%>
        </div>
        <div class="span2 text-right">Created at:
        </div>
        <div class="span2"><%= @business_area.created_at%>
        </div>
      </div>
      <div class="row">
        <div class="span2 text-right">Owner:
        </div>
        <div class="span2"><%= @business_area.owner.login%>
        </div>
        <div class="span2 text-right">Updated by:
        </div>
        <div class="span2"><%= @business_area.updated_by%>
        </div>
      </div>
      <div class="row">
        <div class="span2 text-right">
        </div>
        <div class="span2">
        </div>
        <div class="span2 text-right">updated at:
        </div>
        <div class="span2"><%= @business_area.updated_at%>
        </div>
      </div>

<!-- Tab content -->
    </div>

    </div>
  </div>

<table width=100%>    
  <tr><td><hr /></td></tr>
  <tr align="left">
    <th>Linked Business Flows</th>
    <th></th>
  </tr>
  <tr>
    <td>
      <table class="table table-striped table-condensed">
        <%@business_area.business_flows.each do |business_flow| %>
        <tr align="left">
          <td valign="top"> <%=link_to business_flow.code, business_flow%> </td>
          <td valign="top"> <%=business_flow.name%> </td>
          <td valign="top"> <%=business_flow.description%> </td>
          <td> </td>
        </tr>
        <% end%>
      </table>
    </td>
  </tr>
  <tr>
    <td>
      <%= link_to 'Add business flow', new_business_area_business_flow_path(@business_area) %>
    </td>
  </tr>
</table>
验证业务流创建时记录

--- !ruby/hash:ActionController::Parameters
utf8: ✓
authenticity_token: PwhUukDm3f0OIDhOZfeKxwgtH7M5GFoOuy63Mt7Tcw=
business_flow: !ruby/hash:ActionController::Parameters
  name: aaaaaaa
  code: bbbbbbb
  status_id: '8'
  description: ''
  hierarchy: cccccccc
  PCF_index: ''
  PCF_reference: ''
commit: Create Business flow
action: create
controller: business_flows
我可以想象在表单中隐藏一个
business\u area\u id
字段,但我希望有一种更聪明的方法,将参数传递给create()函数中的new()函数,即使它们必须通过强参数

作为一个初学者,我不能说我对这个问题的分析是否正确,我希望你能帮助我找到一个好的解决方案

非常感谢你的帮助

致以最良好的祝愿


Fred

您正在使用嵌套路由,因此这很好。您没有发布视图代码,因此我假设您没有使用嵌套路由发布到业务流程控制器的创建操作。您的业务流程视图的表单应该如下所示:

# in your controller: @business_flow = BusinessFlow.new
form_for [@business_area, @business_flow] do |f|

... rest of code ...

这将使表单发布到业务流控制器的嵌套创建操作。这样,父级id将作为
params[:business\u area\u id]
出现在路由中。然后,您可以简单地将该id分配给您的子模型,就像您在创建操作中所做的那样。

我看到您的新操作确实具有
business\u area\u id:'2'
参数,但在控制器的新操作中,您没有实例化business\u area。应该是这样的:

class BusinessFlowsController < ApplicationController
  def new
    @business_area = BusinessArea.find params[:business_area_id]
    @business_flow = BusinessFlow.new
    # not needed here since this isn't being created yet
    # @business_flow.business_area_id = params[:business_area_id]
  end
  ... rest of code ...
end
def create
  @business_area = BusinessArea.find params[:business_area_id]
  @business_flow = @business_area.business_flows.build(business_flow_params)
  # assigning the parent id happens automatically in the build method
  # @business_flow.business_area_id = params[:business_area_id]
  @business_flow.updated_by = current_user.login
  @business_flow.created_by = current_user.login
  @business_flow.playground_id = current_user.current_playground_id
  @business_flow.owner_id = current_user.id

  ... rest of code ...
end
要确保表单的操作包括
业务区域\u id
检查呈现的html。表单的属性应如下所示:

action=“/business\u areas//business\u flows”method=“post”


其中,
是父级的整数id,在您的情况下,
2

共享您的服务器日志。感谢您的建议Diego。正如您在我现在提供的更详细的代码中所看到的,我尝试应用您的修改。然而,我仍然有同样的错误。在日志中,我看到调用Create操作时没有使用businessareaid作为参数。我希望这些细节能帮助你帮助我。致以最诚挚的问候。感谢您发布更多代码。我将在回答中继续我的回答,这样我就可以使用代码格式。非常感谢您详细演示了实现此父子功能的好方法。这解决了我的问题,效果很好!(我没有预料到需要重新实例化父业务区域,但当然,没有理由在业务范围外\u区域\u控制器,对吗?)没问题。是的,每次请求到来时,您都必须重新实例化所有内容。你的应用程序不记得以前的操作中发生了什么: