Rails模型/表单布局问题

时间:2011-05-21 20:22:39

标签: ruby-on-rails ruby-on-rails-3 model controller has-many

我正在Rails中制作一个食谱管理员(谁不是他们的第一个应用程序?),这是我的布局:

Ingredient belongs to Recipe
Recipe has many Ingredients

制作反映这种关系的表单的最佳方法是什么?我正在考虑一个输入,当一个填充时,创建另一个,所以在成分的形式的末尾总是“再多一个”。

一旦我制作了UI,模型和控制器的结构会是什么样子?现在我有脚手架控制器create方法:

  def create
    @recipe = Recipe.new(params[:recipe])

    respond_to do |format|
      if @recipe.save
        format.html { redirect_to(recipes_path, :notice => 'You made a new recipe!') }
        format.xml  { render :xml => @recipe, :status => :created, :location => @recipe }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @recipe.errors, :status => :unprocessable_entity }
      end
    end
  end

params[:recipe]是否应该是一个更深层嵌套的对象/哈希/字典,它包含一系列成分或什么?

感谢您提供任何指导。

2 个答案:

答案 0 :(得分:1)

只需用逗号分隔添加成分。

这可以是text_field_tag,因为你需要解析它并用逗号保存每个单词并用之前保存。

class Recipie  < ActiveRecord::Base 

    has_many :ingredients

    before_save :add_ingredients 

    attr_accessor :ingredients_to_parse #this will be the text_field_tag

    def add_ingredients
        #create an array of ingredients from #ingredients_to_parse
        #then loop through that array i.e. you have your ingredients_array   
        ingredients_array.each do 
            Ingredient.create(:recipe => self, :other_params => 'stuff')
        end
        #there are a lot of ways, I just used create to show you how to add it
    end
end

然后在您的表单中只有text_field_tag

<%= form_for(@recipe) do |f| %>
    <% f.text_field :name %>
    <% text_field_tag :ingredients_to_parse %>
    <%= f.submit %>
<% end %>

然后你可以添加Javascript,这样每次在text_field_tag中添加一个逗号,你就可以使用一些js来制作这些花哨的东西。

这样,当服务器运行缓慢,js运行不正常等时,它将起作用。将HTML版本放在首位也是一个好主意。

祝你好运,如果你有疑问/问题,请告诉我。

答案 1 :(得分:1)

您应该在这里使用accepts_nested_attributes

一些链接:

  

API:
  http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for
  截屏:
  http://railscasts.com/episodes/196-nested-model-form-part-1
  http://railscasts.com/episodes/197-nested-model-form-part-2

所以你的模型看起来像这样

class Recipie  < ActiveRecord::Base 
  has_many :ingredients
  accepts_nested_attributes_for :ingridients, :allow_destroy => true
end

查看:

<%= form_for @recipe do |f| %>
  ... # reciepe fields
  <%= f.fields_for :ingridients do |i| %>
    ... # your ingridients forms
  <% end %>
  ...
<% end %>

和控制器

def create
  @recipe = Recipe.new(params[:recipe])
  @recipe.save # some save processing
end