我刚开始学习Rails 4.2。 问题是表单中的一个字段未显示。
我有餐厅,类别和菜。在创建菜肴时,类别和餐厅也将通过/ dishes / new输入。
预期行为:会显示菜单,类别和餐馆字段。
实际行为:仅显示“收件人”和“类别”字段。
以下是我的模特
class Restaurant < ActiveRecord::Base
has_many :categories
has_many :dishes, :through => :categories
end
class Category < ActiveRecord::Base
belongs_to :restaurant
has_many :dishes
end
class Dish < ActiveRecord::Base
belongs_to :category
validates :name, :price, :category, :restaurant, :presence => true
accepts_nested_attributes_for :restaurant, :category
end
def new
# I think this is where
# I am making a mistake
@dish = Dish.new
category = @dish.build_category
restaurant = category.build_restaurant
end
def create
@dish = Dish.new(dish_params)
respond_to do |format|
if @dish.save
.... # default stuff #
end
end
end
# strong params
def dish_params
params.require(:dish).permit(:name, :description, :price, restaurant_attributes: [:name], category_attributes: [:name])
end
<%= form_for(@dish) do |f| %>
<% if @dish.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@dish.errors.count, "error") %> prohibited this dish from being saved:</h2>
<ul>
<% @dish.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :nameWoW %><br>
<%= f.text_area :name %>
</div>
<div class="field">
<%= f.label :description %><br>
<%= f.text_area :description %>
</div>
<div class="field">
<%= f.label :price %><br>
<%= f.number_field :price %>
</div>
*** The restaurant name field is not being displayed **
<%= f.fields_for :restaurant do |restaurant| %>
<div class="field">
<%= restaurant.label :Restname %><br>
<%= restaurant.text_area :name %>
</div>
<% end %>
<%= f.fields_for :category do |category| %>
<div class="field">
<%= category.label :Catname %><br>
<%= category.text_area :name %>
</div>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
我已经按照rails指南中的步骤,浏览了stackoverflow上的问题,并阅读了一些博客帖子,但还没有弄清楚什么是错误的。一些微观层面的错误阻止了我:(。任何人都知道什么是错的?
提前致谢。
嘿,我找到了解决方案。
def new
@dish = Dish.new
@dish.build_category
@dish.category.build_restaurant
end
这很有效。但这只是实际解决方案的一部分。我不得不做很多/碟/创建控制器修改。我认为整个解决方案都必须放在博客文章中。否则它没有任何意义。我很快就会在这里发布和更新它。
答案 0 :(得分:1)
你可以在你的dish.rb中添加它。
class Dish
delegate :restaurant, to: :category
end
或者你可以做到
<%= f.fields_for :restaurant, @dish.category.restaurant do |restaurant| %>
<div class="field">
<%= restaurant.label :Restname %><br>
<%= restaurant.text_area :name %>
</div>
<% end %>
答案 1 :(得分:0)
我想你错过了:
class Dish
belongs_to :restaurant, through: :category
end
你在另一边(很多)但它不存在。您可以通过尝试在表单上输出@ dish.restaurant来测试它(应该是空的但不是零)。
答案 2 :(得分:0)
def new
# I think this is where
# I am making a mistake
@dish = Dish.new
category = @dish.category.build
restaurant = category.restuarant.build
end