参数缺失或值为空:

时间:2019-02-27 14:37:38

标签: ruby-on-rails forms parameters controller back

在查看页面上时,显示错误“缺少参数或值为空:餐厅”。 -我通过删除“ require(:restaurant)”解决了这个问题,但是我不太了解这个窍门...是吗? -我正在寻找一种解决方案,使我能够保留“ require(:restaurant)...任何想法?

restaurants_controller.rb

class RestaurantsController < ApplicationController
  before_action :set_restaurant, only: [:show, :edit, :update]
  def index
    @restaurants = Restaurant.all
  end

  def show
  end

  def new
    @restaurant = Restaurant.new(params.permit(:name, :address, :category))
  end

  def create
    @restaurant = Restaurant.new(restaurant_params)
    @restaurant.save
    redirect_to restaurant_path(@restaurant)
  end

  private

  def set_restaurant
    @restaurant = Restaurant.find(params[:id])
  end

  def restaurant_params
    params.require(:restaurant).permit(:name, :address, :category)
  end
end

new.html.erb

<%= simple_form_for(@restaurant) do |f| %>
  <% if @restaurant.errors.any? %>
    <div class="errors-container">
      <ul>
        <% @restaurant.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>
  <%= f.input :name %>
  <%= f.input :address %>
  <%= f.input :category %>
  <%= f.submit "add a resto", class: "btn btn-primary" %>
<% end %>

restaurant.rb

class Restaurant < ApplicationRecord
  validates :name, :address, :category, presence: true
  validates :category, inclusion: { in: ["chinese", "italian", "japanese", "french", "belgian"]}
  has_many :reviews, dependent: :destroy
end

路线

Rails.application.routes.draw do
  resources :restaurants, only: [:new, :create, :show, :index] do
    resources :reviews, only: [ :new, :create ]
  end
end

2 个答案:

答案 0 :(得分:0)

您的表单输入应命名为:

    restaurant[name]
    restaurant[address]
    restaurant[category]

可能是这样的:

name
address
category

您可以通过检查来调试参数。 您可以在控制器的restaurant_params中执行以下操作:

raise params.inspect

或打开浏览器的调试控制台,然后查看发布的内容。

正如评论中提到的那样,您可以在新方法中使用restaurant_params,但我认为无法解决此问题,很可能是表单存在问题。

# instead of
Restaurant.new(params.permit(:name, :address, :category))
# do
Restaurant.new(restaurant_params)

答案 1 :(得分:0)

我假设您正在尝试使用某些传递的属性自动填充new视图上的表单。

您的restaurant#new正在寻找一个params [:restaurant]哈希来创建一个新的Restaurant对象,但找不到它。看一下您如何调用new动作以及正在传递哪些参数-我的猜测是您没有传递任何参数,或者正在像params[:name]这样的根参数哈希中传递了它们, params[:address]而不是params[:restaurant] => { :name => 'name'}

大多数new操作都是一个GET,因此,如果您使用内联URL参数,则将它们像http://address.com/restaurant/new?restaurant[name]=Bistro&restaurant[category]=burgers一样放入