1

私はレールに不慣れで、レールアプリに取り組んでおり、この問題を熟考しています。

私は3つのモデルを持っています

class Product < ActiveRecord::Base

    attr_accessible :name, :issn, :category, :user_products_attributes

    validates_presence_of :name, :issn, :category
    validates_numericality_of :issn, :message => "has to be a number"

    has_many :user_products
    has_many :users, :through => :user_products

    accepts_nested_attributes_for :user_products

end




class UserProduct < ActiveRecord::Base

  attr_accessible :price, :category

  validates_presence_of :price, :category
  validates_numericality_of :price, :message => "has to be a number"

  belongs_to :user
  belongs_to :product

end

class user < ActiveRecord::Base

  # devise authentication here

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me

  has_many :user_products, :dependent => :destroy
  has_many :products, :through => :user_products

end

製品コントローラー

新しい定義

@product = product.new

@product.user_products.build 

respond_to do |format|
  format.html # new.html.erb
  format.json { render json: @product }
end

終わり

問題は次のとおりです。ユーザーにフォームに製品の情報を入力してもらいたいのですが、製品に関連付けられている別のモデル/テーブル (user_product) に存在する製品の価格も入力する必要があります。これどうやってするの?私の form_for が @product を使用していることがわかります。

どんな助けでも大歓迎です。

    <div class="span8">

       <div id="listBoxWrapper">          
        <fieldset>

         <%= form_for(@product, :html => { :class => "form-inline" }, :style => "margin-bottom: 60px" ) do |f| %>


            <div class="control-group">
              <label class="control-label" for="Category">Category</label>
              <div class="controls">

                <%= f.text_field :category, :class => 'input-xlarge', :id => "Category" %>       

              </div>
            </div>

           <div class="control-group" style="display: inline-table;">
           <label class="control-label" for="First Name">Price($/Month)</label>
             <div class="controls">
              <%= product.fields_for :user_products do |p| %>
                <%= p.text_field :price, :class => 'input-xlarge input-name' %>    
                <% end %>
              </div>
            </div>
4

1 に答える 1

2

それは次のようなものでなければなりません

<%= form_for(@product) do |product| %>
  <%= product.text_field :name, :class => 'input-xlarge input-name' %>
  <%= product.fields_for :user_products do |user_product| %>
      <%= user_product.text_field :price, :class => 'input-xlarge input-name' %>        

user_productsコントローラーでforをビルドする必要があり@productます。お気に入り

@product.user_products.build

Productモデルには次のものが必要です

accepts_nested_attributes_for :user_products

これによりuser_products、製品エンティティの保存中に値が来る可能性があることが認識されます。

編集:

ネストされたフォームのスケルトンを説明するだけです

form_for(@object) do |object_form_builder|
       # call any field generator helper function by object_form_builder like
       object_form_builder.text_field
       object_form_builder.check_box
       # so on...

       #Now for nested forms get the nested objects from the builder like
       object_form_builder.fields_for :nested_objects do |nested_object_builder|
             #generate the fields for this with nested_object_builder. Like
             nested_object_builder.text_field
             # so on...
       end
 end

はい、通常使用するオブジェクトビルダーのように、短い名前を使用すると常に便利fですform_builder

于 2012-08-31T03:58:11.577 に答える