首页 > 解决方案 > Rails 5.2 中的表单提交问题

问题描述

我有一个当前未更新的表单。错误信息是:

NoMethodError(nil:NilClass 的未定义方法“更新”):

在控制台中我有: Completed 500 Internal Server Error

控制器

 def edit
    @coffeeshop = Coffeeshop.find(params[:id])
  end

  def update
    respond_to do |format|
      if @coffeeshop.update(coffeeshop_params)
        format.html { redirect_to @coffeeshop, notice: 'Coffeeshop was successfully updated.' }
        format.json { render :show, status: :ok, location: @coffeeshop }
      else
        format.html { render :edit }
        format.json { render json: @coffeeshop.errors, status: :unprocessable_entity }
      end
    end
  end

...

  private
    def coffeeshop_params
      params.require(:coffeeshop).permit(:roaster_id, :name, :desc, :area, :url, :email, :address, :postcode, :locale, :phone, :image_path, :image_thumb_path, :snippet, :beans, :long_black, :tag_list, :slug, :id, :image)
    end

_形式

<%= form_with(model: @coffeeshop, local: true) do |form| %>
  <% if @coffeeshop.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@coffeeshop.errors.count, "error") %> prohibited this coffee_bean from being saved:</h2>

      <ul>
      <% @coffeeshop.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
  <form>
    <div class="form-group">
      <%= form.label :name %><br />
      <%= form.text_field :name, class: "form-control" %>
    </div>
  <br />
    <div class="form-group">
      <%= form.label :snippet %><br />
      <%= form.text_field :snippet, class: "form-control" %>
    </div>
<br />
    <div class="form-group">
      <%= form.label :Description %><br />
      <%= form.text_area :desc, rows:8, class: "form-control" %>
    </div>
<br />
    <div class="form-group">
      <%= form.label :Locale %><br />
      <%= form.text_field :locale, class: "form-control" %>
    </div>
<br />
    <div class="form-group">
      <%= form.label :Area %><br />
      <%= form.text_field :area, class: "form-control" %>
    </div>
<br />
    <div class="form-group">
      <%= form.label :Website %><br />
      <%= form.url_field :url, class: "form-control" %>
    </div>
<br />
    <div class="form-group">
      <%= form.label :Email %><br />
      <%= form.email_field :email, class: "form-control" %>
    </div>
<br />
    <div class="form-group">
      <%= form.label :Address %><br />
      <%= form.text_field :address, class: "form-control" %>
    </div>
<br />
     <div class="form-group">
      <%= form.label :Postcode %><br />
      <%= form.email_field :postcode, class: "form-control" %>
    </div>
<br />
    <div class="form-group">
      <%= form.label :Phone %><br />
      <%= form.telephone_field :phone, class: "form-control" %>
    </div>
<br />
     <div class="form-group">
      <%= form.label :Image %><br />
      <%= form.text_field :image_path, class: "form-control"%>
    </div>
<br />
     <div class="form-group">
      <%= form.label :Thumbnail %><br />
      <%= form.text_field :image_thumb_path, class: "form-control" %>
    </div>
<br />
     <div class="form-group">
      <%= form.label :Roaster %><br />
      <%= form.collection_select(:roaster_id, Roaster.order(:roaster_name), :roaster_id, :roaster_name, :prompt => 'Select Roaster', class: "form-control") %>
    </div>
<br />
    <div class="form-group">
      <%= form.label :Price_of_a_long_black %><br />
      <%= form.number_field :long_black, class: "form-control" %>
    </div>
<br />
    <div class="form-group">
      <%= form.submit "Submit", class: "btn btn-primary" %>
    </div>

  </form>

<% end %>

该表单使用 collection_select 从roasters.rb模型中提取值,其中:

class Coffeeshop < ApplicationRecord
  belongs_to :roaster

class Roaster < ApplicationRecord
      has_many :coffeeshops

有什么理由不保存?

我也无法创建新记录,哪里会出现错误提示roaster must exist

标签: ruby-on-railsforms

解决方案


问题是 @coffeeshop 没有在你的函数上下文中定义,因此它是 nil 并且不识别更新方法。你应该做的是首先从你的数据库中获取咖啡店,做类似的事情

@coffeeshop = Coffeeshop.find(params[:id]

之后,咖啡店变量将被定义,您将被允许更新。另一种方法是定义私有方法,例如

def coffeeshop
  @coffeeshop ||= Coffeeshop.find(params[:id]
end

这样你就可以使用coffeeshop作为一种方法,如果你已经用过就不会再被搜索了。


推荐阅读