0

既存のモデルで非常に単純なフォーラムを作成するのに助けが必要です。

私がゲームページに欲しいものは、ミニフォーラムを持っています。そこでは、いくつかのトピックとこのトピックへのコメントを作成することができます。最初はトピックのみを実装しています。

これは私が持っているエラーです:

Mysql2::Error: Column 'user_id' cannot be null: INSERT INTO `topics` (`game_id`, `question`, `user_id`) VALUES (1, 'asd', NULL) 

これが私のメインモデルです。

game.rb

class Game < ActiveRecord::Base
   attr_accessible :name

   validates :user_id, presence: true
   validates :name, presence: true, length: { maximum: 50 }

   belongs_to :user

   has_many :topics, dependent: :destroy

end

topic.rb

class Topic < ActiveRecord::Base
     validates_presence_of :question
     validates_presence_of :game_id

     attr_accessible :question, :user_id

     validates :question, length: {maximum: 50}, allow_blank: false

     belongs_to :game
     belongs_to :user
end

topic_controller.rb

def create
    @game = Game.find(params[:game_id])
    @topic = @game.topics.create(params[:topic])
    @topic.user_id = current_user.id

    respond_to do |format|
      if @topic.save
        format.html { redirect_to @game, notice: 'Topic was successfully created.' }
      else
        format.html { render action: "new" }
      end
    end
end

game / show.html.erb

<h2>Topics</h2>
<% @game.topics.each do |topic| %>

    <p>
      <b>Question:</b>
      <%= topic.question %>
    </p>
<% end %>

<h2>Add a topic:</h2>
<%= form_for([@game, @game.topics.build]) do |f| %>
    <div class="field">
     <%= f.label :question %><br />
      <%= f.text_field :question %>
    </div>
    <div class="actions">
      <%= f.submit %>
    </div>
<% end %>

ありがとう ;)

4

4 に答える 4

1

あなたが経験している問題は、RailscreatenewRailsの違いだと思います。

を使用newすると、モデルが初期化されるだけで、後で保存/検証できます。usingを使用createすると、これらすべての手順が1つのコマンドで実行され、データベース行が作成されます。

だからあなたが実行しようとすると

@game.topics.create(params[:topic])

Railsは、を使用しparams[:topic]てに設定しgame_idてトピックを作成しようとします@game.id。その後、作成したこの新しいトピックをすぐに検証してデータベースに保存しようとします。

検討できる可能性のあるオプション:

1)使用@game.topics.new(params[:topic])

2)マージイン{:user_id => current_user.id}@game.topics.create(params[:topic].merge({:user_id => current_user.id})

私は個人的にオプション1を提案します(つまり、代わりにnewを使用します)が、以前にオプション2が使用されているのを見ました。

編集:あなたが経験しているように見える別の問題:あなたのコードにcurrent_userあるべきですか?@current_user


補足:通常、createデータベース行の作成に失敗しても機能します(代わりに初期化されたモデルを返します)が、あなたの場合、user_idのデータベースレベルの制限がNOT NULLであるため、これは発生しないようです。キャッチされなかったエラー。

于 2012-11-18T12:39:50.533 に答える
0

ログインせずにサイトにアクセスしていると思いますので、user_id設定されません。トピックを変更または作成しているすべてのアクションに対して、ログインしているユーザーがいることを確認する必要があります。簡単なアプローチは、このRailscastにあります。

于 2012-11-18T11:59:11.487 に答える
0

ネストされたリソースに関するRailsガイドを読むことを検討することをお勧めします。私はあなたが今いるところにいました、この議論を見てください。

于 2012-11-18T10:58:00.970 に答える
0

正しく設定されていないと思います。current_user.idこれらの問題は他のほとんどすべての問題であるかどうかを確認してください。rubyデバッガーが厄介な方法です。

GEMファイルに追加します

GEMファイル

gem 'debugger'

走るbundle install

次に、コントローラーで

def create
    @game = Game.find(params[:game_id])
    @topic = @game.topics.create(params[:topic])

    @topic.user_id = current_user.id

    debugger

    respond_to do |format|
      if @topic.save
        format.html { redirect_to @game, notice: 'Topic was successfully created.' }
      else
        format.html { render action: "new" }
      end
    end
end

これにより、デバッガー行で停止し、コンソールから値が設定されているかどうかを確認できます。詳細についてはこれを確認してください

于 2012-11-18T12:21:36.090 に答える