我需要一些帮助,在现有模型中创建一个非常简单的论坛。
我想在游戏页面中找到一个迷你论坛,在哪里可以创建一些主题和一些评论。一开始我只会实现主题。
这是我的错误:
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
游戏/ 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 %>
谢谢;)
答案 0 :(得分:1)
我相信您遇到的问题是Rails中create
和new
之间的差异。
使用new
仅初始化模型,允许您稍后保存/验证;使用create
将在一个命令中执行所有这些步骤,从而导致创建数据库行。
所以当你尝试执行
时@game.topics.create(params[:topic])
Rails尝试使用params[:topic]
创建主题并将game_id
设置为@game.id
,然后立即尝试验证它创建的新主题并将其保存到数据库。
您可以考虑的潜在选项:
1)使用@game.topics.new(params[:topic])
2)合并{:user_id => current_user.id}
in @game.topics.create(params[:topic].merge({:user_id => current_user.id})
我个人建议选项1(即使用new),但我看过之前使用的选项2.
编辑:您可能遇到的另一个问题是:您的代码中current_user
应该@current_user
吗?
旁注:
通常,如果create
无法创建数据库行,它仍然可以工作(改为返回初始化模型),但在您的情况下,由于对user_id的数据库级限制为NOT NULL,因此看起来不会发生这种情况,导致未被捕获的错误。
答案 1 :(得分:0)
您可能需要考虑阅读Rails Guide on nested resources。我一直在你现在的位置,看看this discusion。
答案 2 :(得分:0)
我猜您是在没有登录的情况下访问该网站的,因此不会设置user_id
。您应该确保所有正在修改或创建主题的操作都有登录用户。可以在this Railscast中找到一种简单的方法。
答案 3 :(得分: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
这将使您在调试器行中停止,然后从控制台可以看到是否设置了值。 check this for more