2017-01-13 18 views
0

私は2つのモデルを1つのフォームで提出しようとしています。 これらのコードを作成したにもかかわらず、フォームは「記事」レコードのみを作成します。 "ArticleHistory"レコードはこのフォームで作成する必要があります。しかし、現時点では、フォームはありません。2つのモデルで同時にレコードをサブミットする方法は?

誰かが私のコードに間違いを知っていますか?どうして?

ここは私の意見です(スリム)。

h2 It's new article 
p test 
= form_for @article do |f| 
    = f.fields_for :article_history do |af| 
    .field 
     = af.label :title 
     br 
     = af.text_field :title 
    .field 
     = af.label :content 
     br 
     = af.text_area :content 
    = af.hidden_field :id 
    .field 
    = f.hidden_field :status, :value => "publish" 
    = f.hidden_field :user_id, :value => current_user.id 
    = f.hidden_field :current_version, :value => 1 
    .actions 
    = f.submit 'submit' 

また、私のモデルです。

class Article < ApplicationRecord 
    has_many :article_histories 
    accepts_nested_attributes_for :article_histories 
end 

class ArticleHistory < ApplicationRecord 
    belongs_to :article 
end 

ここにコントローラがあります。私は必要な部分だけを引用しました。

class ArticlesController < ApplicationController 
    def new 
    @article = Article.new 
    @article.article_histories.build 
    end 

    def create 
    @article = Article.new(article_params) 
    if @article.status == "publish" 
     @article.publish_datetime = Time.now.to_s(:db) 
    end 

    if params[:article][:back] 
     render :new 
    elsif @article.save 
     redirect_to @article, notice: 'Article was successfully created.' 
    else 
     render :new 
    end 
    end 
private 
    def article_params 
    params.require(:article).permit(:current_version , :status , :user_id , article_histories_attributes:[:id, :article_id, :version, :title, :content]) 
    end 
end 

これはバージョン情報です。

$ bin/rails -v 
Rails 5.0.1 
$ ruby -v 
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin14] 

ありがとうございます!あなたのelsif @article.saveあなたが

ArticleHistory.create(article_params) 

またはそれらが関連付けられているので、その後、あなたは、単純なコール( "article_histories" についてのイム完全にわからないことができますを呼び出すことができます内側

[ActiveRecordのエラー]

Started POST "/articles" for ::1 at 2017-01-13 12:10:35 +0900 
Processing by ArticlesController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"ZUMBqozYl4vWNxImgz8ghY7gGb2NPp4qMnXYulqkoPAMTWueIN8xAITCo7NSDP/rDgJQOLNOEqLwUcy3kl4BTQ==", "article"=>{"article_history"=>{"title"=>"title1210", "content"=>"content1210", "id"=>""}, "status"=>"publish", "user_id"=>"9", "current_version"=>"1"}, "commit"=>"確認"} 
    User Load (0.8ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 9 ORDER BY `users`.`id` ASC LIMIT 1 
Unpermitted parameter: article_history 
    (0.6ms) BEGIN 
    SQL (0.7ms) INSERT INTO `articles` (`current_version`, `status`, `publish_datetime`, `user_id`, `created_at`, `updated_at`) VALUES (1, 'publish', '2017-01-13 03:10:43', 9, '2017-01-13 03:11:05', '2017-01-13 03:11:05') 
    (2.3ms) COMMIT 
+0

ここで設定した[ネストされた属性](http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html)でこれを分解しますが、 'article_params 'メソッドを呼び出すことができます。あなたはそれを正しく受け入れていますか?そうでなければ無視されるかもしれません。 – tadman

+0

@tadman申し訳ありませんが、私はほとんど忘れました。上記のコードを追加します。それを調べることができますか? –

+1

モデルやネストされたモデルが検証に失敗した場合には 'save!'を呼び出すことができます。その場合は 'rescue ActiveRecord :: RecordInvalid'を呼び出すことができます。例外は無視しにくい。実際にレコードを作成しようとしている 'log/development.log'もチェックしてください。 – tadman

答えて

2

コンソールで試すことができます)

@article.article_histories.create(article_params) 

の場合は、article_paramsを必要なパラメータに変更できます。

+0

コメントありがとうございます。私はあなたのアドバイスに沿って行を挿入し、再度実行します。しかし残念ながら、このようなエラーが表示されます。 "ArticleHistoryには未知の属性 'current_version'があります。" –

+0

article_paramsが" current_version "パラメータを持っているために記事の履歴にcurrent_versionという名前がないため、エラーが発生する可能性があります。たとえば、ArticleHistory.create(id:1、any_param:" value "、any_param :params [:your_params]) – bxorcloud

1

申し訳ありませんが、私の間違いです。私は私のエラーに気づいた。

私のフォームはもともとこのようなものです。最後に、この

h2 It's new article 
p test 
= form_for @article do |f| 
    = f.fields_for :article_histories do |af| 

に変更

h2 It's new article 
p test 
= form_for @article do |f| 
    = f.fields_for :article_history do |af| 

、それが動作します。すべての貢献をありがとう!

+1

これはその方法です。 –

関連する問題