进入视图页面时,显示错误“param is missing or value is empty: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
表单的输入应该如下命名:
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)
我假设您尝试使用一些传递的属性在new
视图上自动填充表单。
你的restaurant#new
正在寻找一个params [:restaurant]哈希来创建一个新的Restaurant
对象而无法找到它。看看你是如何调用new
动作以及传递了什么参数 - 我的猜测是你没有传递任何参数,或者你将它们传递给root参数哈希,如params[:name]
,params[:address]
而不是params[:restaurant] => { :name => 'name'}
。
大多数new
动作都是GET,所以如果你使用内联URL参数,就像http://address.com/restaurant/new?restaurant[name]=Bistro&restaurant[category]=burgers
一样