无法访问表单

时间:2015-05-17 19:41:05

标签: ruby-on-rails ruby forms model has-many-through

我正在尝试为has_many构建一个表单:通过关系。问题是,我可以从表单中的连接表(:through)访问属性,但不能访问其他表。

我的模特看起来像这样:

class Recipe < ActiveRecord::Base
   has_many :quantities
   has_many :ingredients, through: :quantities
   accepts_nested_attributes_for :quantities
end

class Quantity < ActiveRecord::Base
  belongs_to :recipe
  belongs_to :ingredient
end

class Ingredient < ActiveRecord::Base
  has_many :quantities
  has_many :recipes, through: :quantities 
end

我的表格:

<%= form_for(@recipe) do |f| %>
  <div class="field">
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :description %><br>
    <%= f.text_area :description %>
  </div>


  <div class="quantities">
    <%= f.fields_for :quantities do |builder| %>
      <%= render 'quantity_fields', :f => builder%>
    <% end %>
    <%= link_to_add_association 'Add', f, :quantities %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

数量_字段部分:

<p>
<%= f.label :value, "Value" %>
<%= f.text_field :value %>
<%= f.label :unit, "Unit" %>
<%= f.text_field :unit %>
<%= f.text_field :ingredient %>
<%= f.fields_for :ingredient do |builder|%>
  <%= builder.label :name, "Ingredient"%>
  <%= builder.text_field :name %>
<% end %>
</p>

数量属性的字段是正确的,但成分名称的文本字段(在quantity_fields部分内)保持为空。 另一方面,在Rails控制台上,我可以轻松地在数量对象上使用成分方法并获得结果。

我试着找到一个解决方案,因为一段时间了,这对我来说真的很令人沮丧。我确信这是一项标准任务,我只是缺少一小部分。任何人都可以帮助我吗?

修改

另外,当我更改配方表格以直接渲染配料时,它不起作用。文本字段仍为空。

<%= form_for(@recipe) do |f| %>
  <div class="field">
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :description %><br>
    <%= f.text_area :description %>
  </div>

  <div class="ingredients">
    <%= f.fields_for :ingredients do |builder| %>
      <p>
      <%= builder.label :name, "Name" %>
      <%= builder.text_field :name %>
      <%= builder.label :description, "Description" %>
      <%= builder.text_field :description %>
      </p>
    <% end %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

编辑2: 食谱控制器:

class RecipesController < ApplicationController
  before_action :set_recipe, only: [:show, :edit, :update, :destroy]

  # GET /recipes
  # GET /recipes.json
  def index
    @recipes = Recipe.all
  end

  # GET /recipes/1
  # GET /recipes/1.json
  def show
  end

  # GET /recipes/new
  def new
    @recipe = Recipe.new
  end

  # GET /recipes/1/edit
  def edit
  end

  # POST /recipes
  # POST /recipes.json
  def create
    @recipe = Recipe.new(recipe_params)

    respond_to do |format|
      if @recipe.save
        format.html { redirect_to @recipe, notice: 'Recipe was successfully created.' }
        format.json { render :show, status: :created, location: @recipe }
      else
        format.html { render :new }
        format.json { render json: @recipe.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /recipes/1
  # PATCH/PUT /recipes/1.json
  def update
    respond_to do |format|
      if @recipe.update(recipe_params)
        format.html { redirect_to @recipe, notice: 'Recipe was successfully updated.' }
        format.json { render :show, status: :ok, location: @recipe }
      else
        format.html { render :edit }
        format.json { render json: @recipe.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /recipes/1
  # DELETE /recipes/1.json
  def destroy
    @recipe.destroy
    respond_to do |format|
      format.html { redirect_to recipes_url, notice: 'Recipe was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_recipe
      @recipe = Recipe.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def recipe_params
      params.require(:recipe).permit(:title, :description, quantities_attributes: [:value, :unit, :recipe, :ingredient, :_destroy])
    end
end

1 个答案:

答案 0 :(得分:0)

以这种方式使用has_many :through关联时,您可以像这样设置模型:

class Recipe < ActiveRecord::Base
   has_many :quantities
   has_many :ingredients, inverse_of: :recipes

   accepts_nested_attributes_for :quantities
end

class Quantity < ActiveRecord::Base
  belongs_to :recipe
  belongs_to :ingredient

  accepts_nested_attributes_for :ingredients
end

class Ingredient < ActiveRecord::Base
  has_many :quantities
  has_many :recipes, inverse_of: :ingredients 
end

This article涵盖了has_many的嵌套属性:通过类似上下文中的关联。希望这有帮助!