rails 4嵌套表单fields_for不显示

时间:2015-03-29 14:32:28

标签: ruby-on-rails ruby ruby-on-rails-4 erb

我刚开始学习Rails 4.2。 问题是表单中的一个字段未显示。

我有餐厅,类别和菜。在创建菜肴时,类别和餐厅也将通过/ dishes / new输入。

预期行为:会显示菜单,类别和餐馆字段。

实际行为:仅显示“收件人”和“类别”字段。

以下是我的模特

模型/ restaurant.rb

class Restaurant < ActiveRecord::Base
  has_many :categories
  has_many :dishes, :through => :categories
end

模型/ category.rb

class Category < ActiveRecord::Base
  belongs_to :restaurant
  has_many :dishes
end

模型/ dish.rb

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

Dishes views / dishes / _form.html.erb

    <%= 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

这很有效。但这只是实际解决方案的一部分。我不得不做很多/碟/创建控制器修改。我认为整个解决方案都必须放在博客文章中。否则它没有任何意义。我很快就会在这里发布和更新它。

3 个答案:

答案 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