0

私のコードでは、「has_many => belongs_to」モデルの関連付けと、新しいアクションのビューにネストされたフォームがあることがわかります。

さらに、Railsフォームハンドラーで同じパラメーターに2つの別々のフィールドを使用しましたか?

問題は、「prix」属性 (「Projet」モデル) がデータベースに記録されますが、「nom」属性 (「Activite」モデル) は記録されないことです。

問題は強力なパラメータにあるのかもしれませんが、私のコードではすべて問題ないと思います...または、リンクした他のStackoverflowの質問で見つけたコードの中にあるかもしれません。

私のコードにはフランス語の単語があります: activite は活動、projet はプロジェクト、nom は名前、prix は価格、非常に簡単です :)

ご協力いただきありがとうございます !

アプリ/モデル/projet.rb:

class Projet < ActiveRecord::Base

    has_many :activites

    accepts_nested_attributes_for :activites,
    reject_if: lambda {|attributes| attributes['nom'].blank?}

end

アプリ/モデル/activite.rb:

class Activite < ActiveRecord::Base

    belongs_to :projet

    def acttext=(value)
      @acttext = value if value
      prepare_act
    end

  def actselect=(value)
    @actselect = value if value
    prepare_act
  end

  def acttext
    @acttext || self.nom
  end

  def actselect
    @actselect || self.nom
  end

private 
  def prepare_act
    self.nom = acttext if acttext
    self.nom = actselect if actselect
  end

end

app/controllers/projets_controller.rb :

class ProjetsController < ApplicationController

    def new
        @projet = Projet.new
        @activites_options = Activite.pluck(:nom).uniq
        2.times { @projet.activites.new}
    end

    def create
        @projet = Projet.new(projet_params)

        if @projet.save
          redirect_to @projet
        else
          render 'new'
        end
    end

  private

    def projet_params
      params.require(:projet).permit(:prix, activites_attributes: [:id, :nom, :heures, :minutes, :acttext, :actselect])
    end
end

app/views/projets/new.html.erb :

<div>
    <%= form_for @projet do |f| %>    
    <%= f.label :prix %><br> 
    <%= f.text_area :prix %><br>
            <ul>
              <%= f.fields_for :activites do |activites_form| %>
                <li>
                  <%= activites_form.label :choisissez_un_type_dactivité %>
                  <%= activites_form.select :actselect, @activites_options, {include_blank: true} %>

                  <%= activites_form.label :ou_créez_en_un_nouveau %>
                  <%= activites_form.text_field :acttext %><br>

                  <%= activites_form.label :heures %>
                  <%= activites_form.text_field :heures %>

                  <%= activites_form.label :minutes %>
                  <%= activites_form.text_field :minutes %>
                </li>
                <br>
              <% end %>
            </ul>
    <p><%= f.submit "Créer le projet" %></p>
    <% end %>
    </div>
4

1 に答える 1

0

仮想属性を機能させるには、setter と getter も定義する必要があります。これは、getter と setter を自分で明示的に定義するか、または を使用して行うことができますattr_accessor

使用例attr_accessor

class Activite < ActiveRecord::Base
  attr_accessor :nom
  ....

end

セッターとゲッターの両方を手動で定義する例:

class Activite < ActiveRecord::Base
  ....

  def nom=(value)
    super
  end

  def nom
    @nom
  end
end

フランス語であることによるクラスの命名に関する 2 番目の問題については、両方でclass_nameオプションを指定し、英語以外のクラス名を次のように指定することもできます。has_manybelongs_to

class Projet < ActiveRecord::Base
  has_many :activites, class_name: 'Activite'
end

同様に、Activiteモデルの場合:

class Activite < ActiveRecord::Base
  belongs_to :projet, class_name: 'Projet'
end
于 2015-07-30T13:28:12.177 に答える