【问题标题】:Create data through a form edit from another controller via nested attributes通过嵌套属性从另一个控制器通过表单编辑创建数据
【发布时间】:2017-10-31 15:32:21
【问题描述】:

我正在尝试通过编辑表单为其他控制器中的操作添加值。我有以下型号:

class Day < ApplicationRecord
  belongs_to :goal
  has_many :day_salesmen, dependent: :destroy
  has_many :salesmen, through: :day_salesmen
  validates_presence_of :date_day, :goal_id

  accepts_nested_attributes_for :day_salesmen
end

class Salesman < ApplicationRecord
  belongs_to :company
  has_many :goal_salesmen, dependent: :destroy
  has_many :goals, through: :goal_salesmen

  has_many :day_salesmen, dependent: :destroy
  has_many :days, through: :day_salesmen

end

class DaySalesman < ApplicationRecord
  belongs_to :day
  belongs_to :salesman

  accepts_nested_attributes_for :salesman
end

换句话说,我有一天可以有很多员工,很多员工可以成为一天的一部分。

当我编辑一天时,我希望能够添加员工并通过 day_salesman 表将他们与我的一天相关联。

我正在尝试这样做,但我收到以下错误日志:

ActionController::ParameterMissing (param is missing or the value is empty: salesman):

app/controllers/salesmen_controller.rb:49:in `params_salesman'
app/controllers/salesmen_controller.rb:17:in `create'
  Rendering /box/gems/actionpack-5.0.6/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout
  Rendering /box/gems/actionpack-5.0.6/lib/action_dispatch/middleware/templates/rescues/_source.html.erb
  Rendered /box/gems/actionpack-5.0.6/lib/action_dispatch/middleware/templates/rescues/_source.html.erb (32.8ms)
  Rendering /box/gems/actionpack-5.0.6/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb
  Rendered /box/gems/actionpack-5.0.6/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (28.5ms)
  Rendering /box/gems/actionpack-5.0.6/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb
  Rendered /box/gems/actionpack-5.0.6/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (53.3ms)
  Rendered /box/gems/actionpack-5.0.6/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (216.0ms)
Started POST "/companies/3/salesmen" for 172.24.0.1 at 2017-10-31 15:21:09 +0000
Cannot render console from 172.24.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by SalesmenController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"/5ULp1WOehoaJIZL0SaCSDYU9MssS7ZQ5EfyTkmZCyFSvogj6lOtxOTuNTx8AjdeRjAnkkd3XhD5V30/QAXijg==", "day"=>{"value"=>"400", "day_salesman"=>{"salesman"=>{"name"=>"Denis"}}},"commit"=>"Create","company_id"=>"3"}
  [1m[36mOwner Load (3.5ms)[0m  [1m[34mSELECT  "owners".* FROM "owners" WHERE "owners"."id" = $1 ORDER BY "owners"."id" ASC LIMIT $2[0m  [["id", 1], ["LIMIT", 1]]
Completed 400 Bad Request in 108ms (ActiveRecord: 12.7ms)

我的控制器是:

class SalesmenController < ApplicationController
  before_action :find_salesman, only: [:edit, :update, :destroy, :show]

  def index
    @salesman = current_owner.companies.find(params[:company_id]).salesman
  end

  def new

  end

  def show

  end

  def create
    @salesman = Salesman.new(params_salesman)
    if @salesman.save
      flash[:notice] = "Salesman saved!"
    else
      flash.now[:error] = "Cannot create salesman!"
      render :new
    end
  end

  def edit
  end

  def update
    if @salesman.update(params_salesman)
      flash[:notice] = "salesman updated!"
    else
      flash.now[:error] = "Could not update salesman!"
      render :edit
    end
  end

  def destroy
    @salesman.destroy
  end

  private

  def find_salesman
    @salesman = Salesman.find(params[:id])
  end

  def params_salesman
    params.require(:salesman).permit(:name).merge(company_id: params[:company_id])
  end
end

DaysController:

class DaysController < ApplicationController
  before_action :find_day, only: [:show, :edit, :update]

  def index
    @day = current_owner.companies.find(params[:company_id]).goal.find(params[:goal_id]).days
  end

  def show
  end

  def edit
    @dayup = Day.new
    @day_salesmen = @dayup.day_salesmen.build
    @salesman = @day_salesmen.build_salesman
  end

  def update
    if @day.update(params_day)
      flash[:notice] = "Day updated!"
      redirect_to company_salesman_path(:id => @day.id)
    else
      flash.now[:error] = "Could not update day!"
      render :edit
    end
  end

  private

  def find_day
    @day = Day.find(params[:id])
  end

  def params_day
    params.require(:day).permit(:value, day_salesman_attributes: [:id, salesman_attributes:[:name]]).merge(goal_id: params[:goal_id])
  end
end

我对控制器日的视图编辑:

<%= form_for(@dayup, url: company_salesmen_path) do |f| %>
  <%= f.label :value_of_day %>
  <%= f.number_field :value %>
  <%= f.fields_for :day_salesman do |ff| %>
    <%= ff.fields_for :salesman do |fff| %>
      <%= fff.label :names_of_salesmen %>
      <%= fff.text_field :name %>
    <% end %>
  <% end %>
  <%= f.submit "Create" %>
<% end %>

我的路线是:

Rails.application.routes.draw do
  root to: 'companies#index'
  resources :companies do
    resources :salesmen
    resources :goals do
      resources :days
    end
  end
  devise_for :owners, :controllers => { registrations: 'registrations' }
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

我正在尝试使用嵌套属性,但似乎我应用了错误的方式,有人可以帮助您通过日子的编辑表格找到推销员并将它们关联起来吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 nested-attributes


    【解决方案1】:

    salesmen_controller.rb 中应该是这样的,我不确定你在强参数中使用什么。请尝试并相应地修改它

      def params_salesman
        params.require(:day).require(:day_salesman).require(:salesman).permit(:name).merge(company_id: params[:company_id])
      end
    

    【讨论】:

    • 它的作品。但是有了这个我要创建推销员,不是日值没有更新,也不是日推销员表......
    • 似乎您已经给出了创建操作的 url,因此请提供 url 进行更新。您可以使用 rake 路由检查 url
    • 嗯...以防我将表单重定向到更新推销员?但我没有设置任何推销员。
    【解决方案2】:

    我会尝试替换

    <%= f.fields_for :salesman do |fff| %>
    

    与:

    <%= ff.fields_for :salesman do |fff| %>
    

    获取适当的表单生成器。

    【讨论】:

    • 嗯...我试过了,但我得到了同样的错误...参数丢失或值为空:销售员...和参数请求:{“utf8”=>“✓” , "authenticity_token"=>"/KrtqGY6QK0l28t/LnUpr8cUh51uEegxG6FbCtIkg5hRgW4s2eeXc9sReAiDUZy5tzBUxAUtAHEGsdR727hqNw==", "day"=>{"value"=>"400", "day_salesman"=>{"salesman"=>{"name }}}, "commit"=>"创建", "company_id"=>"3"}
    • 你的数据是嵌套的:"day"=&gt;{"value"=&gt;"400", "day_salesman"=&gt;{"salesman"=&gt;{"name" 所以反映这个来获取它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多