0

我需要一些帮助在现有模型中创建一个非常简单的论坛。

我想要的游戏页面,有一个迷你论坛,可以在其中创建一些主题和对此主题的一些评论。一开始我只是实现主题。

这是我遇到的错误:

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

这是我的主要模型:

游戏.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

主题.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

主题控制器.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

游戏/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

我相信您遇到的问题是Rails之间create的差异。new

仅使用new初始化模型,允许您稍后保存/验证;usingcreate将在一个命令中执行所有这些步骤,从而创建数据库行。

所以当你尝试执行

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

Rails 尝试使用params[:topic]并设置game_idto创建一个主题@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

You may want to consider reading the Rails Guide on nested resources. I've been where you are now , take a look at this discusion.

于 2012-11-18T10:58:00.970 回答
0

我猜您是在未登录的情况下访问该站点,因此user_id不会设置。您应该确保所有修改或创建主题的操作都有一个登录用户。在这个 Railscast中可以找到一个简单的方法。

于 2012-11-18T11:59:11.487 回答
0

我认为current_user.id设置不正确,请检查这些问题几乎是所有其他问题,ruby 调试器是最受困扰的方法

在您的 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 回答