Ruby on rails 编辑嵌套属性/模型轨道

Ruby on rails 编辑嵌套属性/模型轨道,ruby-on-rails,ruby-on-rails-5,nested-attributes,Ruby On Rails,Ruby On Rails 5,Nested Attributes,您好,我正在使用@jordanhudgens嵌套属性教程构建一个rails应用程序来处理@sites和@site_资产。我可以添加新的@site_资产并删除它们,但我很难编辑它们 我尝试编辑时出现以下错误 ArgumentError in Sites::SiteAssets#edit Showing app/views/sites/site_assets/_form.html.erb where line #1 raised: First argument in form cannot con

您好,我正在使用@jordanhudgens嵌套属性教程构建一个rails应用程序来处理@sites和@site_资产。我可以添加新的@site_资产并删除它们,但我很难编辑它们

我尝试编辑时出现以下错误

ArgumentError in Sites::SiteAssets#edit
Showing app/views/sites/site_assets/_form.html.erb where line #1 raised:

First argument in form cannot contain nil or be empty
Extracted source (around line #1):

<%= form_for [@site, @site_asset] do |form| %>

  <div class="field">
    <%= form.label :name %>
    <%= form.text_field :name, id: :site_asset_name %>
  </div>

Trace of template inclusion: app/views/sites/site_assets/edit.html.erb
ArgumentError在站点::SiteAssets#编辑
显示第1行出现的app/views/sites/site_assets/_form.html.erb:
表单中的第一个参数不能包含nil或为空
提取的源(第1行附近):
模板包含跟踪:app/views/sites/site_assets/edit.html.erb
站点显示页面,显示站点资源循环,包括编辑按钮

<tbody>
  <% @site_assets.each do |site_asset| %>
    <tr>
      <td><%= site_asset.name %></td>
      <td><%= site_asset.asset_type.name %></td>
      <td><%= site_asset.manufacturer.name %></td>
      <td><%= site_asset.model %></td>
      <td><%= site_asset.serial %></td>
      <td><%= site_asset.location.name %></td>
      <td><%= site_asset.installed %></td>
      <td><%= site_asset.condition %></td>
      <td><%= link_to 'Edit', edit_site_site_asset_path(site_id: @site.id, id: site_asset.id) %></td>
      <td><%= link_to 'Delete', [@site, site_asset], method: :delete, confirm: 'are you sure?'%></td>
    </tr>
  <% end %>
  </tbody>

视图/sites/site_assets/_form.erb.html

<%= form_for [@site, @site_asset] do |form| %>

  <div class="field">
    <%= form.label :name %>
    <%= form.text_field :name, id: :site_asset_name %>
  </div>
  <div class="field">
    <%= form.label :manufacturer_id %>
    <%= form.collection_select :manufacturer_id, Manufacturer.all, :id, :name %>
  </div>

  <div class="field">
    <%= form.label :model %>
    <%= form.text_field :model, id: :site_asset_model %>
  </div>

  <div class="field">
    <%= form.label :serial %>
    <%= form.text_field :serial, id: :site_asset_serial %>
  </div>

  <div class="field">
    <%= form.label :location_id %>
    <%= form.collection_select :location_id, Location.all, :id, :name %>
  </div>

  <div class="field">
    <%= form.label :asset_type_id %>
    <%= form.collection_select :asset_type_id, AssetType.all, :id, :name %>
  </div>

  <div class="field">
    <%= form.label :installed %>
    <%= form.date_select :installed, id: :site_asset_installed, class: 'datepicker' %>
  </div>

  <div class="field">
    <%= form.label :condition %>
    <%= form.select :condition, SiteAsset.conditions.keys %>
  </div>


  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

场地资产模型

class SiteAsset < ApplicationRecord
  belongs_to :site
  belongs_to :asset_type
  belongs_to :location
  belongs_to :manufacturer

  enum condition: { New: 4, Good: 3, Ok: 2, Poor: 1 }
end
class SiteAsset
控制器/站点/站点\资产\控制器

class Sites::SiteAssetsController < ApplicationController

  # GET /site_assets
  # GET /site_assets.json
  def index
    @site_assets = SiteAsset.all
  end

  # GET /site_assets/1
  # GET /site_assets/1.json
  def show
  end

  # GET /site_assets/new
  def new
    @site = Site.find(params[:site_id])
    @site_asset = SiteAsset.new
  end

  # GET /site_assets/1/edit
  def edit
  end

  # POST /site_assets
  # POST /site_assets.json
  def create
    @site = Site.find(params[:site_id])
    @site_asset = SiteAsset.new(site_asset_params)
    @site_asset.site = @site

    respond_to do |format|
      if @site_asset.save
        format.html { redirect_to @site, notice: 'Site asset was successfully created.' }
        format.json { render :show, status: :created, location: @site_asset }
      else
        format.html { render :new }
        format.json { render json: @site.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /site_assets/1
  # PATCH/PUT /site_assets/1.json
  def update

    @site = Site.find(params[:site_id])
    @site_asset = SiteAsset.find(params[:id])

    respond_to do |format|
      if @site_asset.update(site_asset_params)
        format.html { redirect_to @site, notice: 'Site asset was successfully updated.' }
        format.json { render :show, status: :ok, location: @site_asset }
      else
        format.html { render :edit }
        format.json { render json: @site.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /site_assets/1
  # DELETE /site_assets/1.json
  def destroy
    @site = Site.find(params[:site_id])
    @site_asset = SiteAsset.find(params[:id])

    @site_asset.destroy
    respond_to do |format|
      format.html { redirect_to @site, notice: 'Site asset was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_site_asset
      @site_asset = SiteAsset.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def site_asset_params
      params.require(:site_asset).permit(:name, :model, :serial, :installed, :site_id, :manufacturer_id, :asset_type_id, :location_id, :condition)
    end
end
类站点::SiteAssetController

正如我所说,create和delete方法都能完美地工作。正是编辑让我

您需要在编辑方法中添加以下行

@site = Site.find(params[:site_id])
@site_asset = SiteAsset.find(params[:id])

呈现编辑表单时,它需要@site和@site_资源,但它收到的是零。这就是它显示上述错误的原因

这非常有帮助,我在更新中添加了正确的代码,所以我只是复制它进行编辑。谢谢你给我指引了正确的方向,如果你更新了你的答案,我会把它标记正确。如果你没有使用任何过滤器设置
@site
@site\u assets
,我想你也需要将此代码放在编辑方法中。我检查了你的站点\u资产\u控制器,没有找到任何筛选器。