在查看页面上时,显示错误“缺少参数或值为空:餐厅”。 -我通过删除“ 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
答案 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
一样放入