我在理解问题根源方面遇到了一些困难。 下面是模型类的列表。基本上,目标是能够在故事结尾添加句子,或者将故事添加到现有的句子中。现在,我只是试图允许用户添加句子,并自动为新句子创建一个新的sentence_block。
class Story < ActiveRecord::Base
has_many :sentence_blocks, :dependent => :destroy
has_many :sentences, :through => :sentence_blocks
accepts_nested_attributes_for :sentence_blocks
end
class SentenceBlock < ActiveRecord::Base
belongs_to :story
has_many :sentences, :dependent => :destroy
end
class Sentence < ActiveRecord::Base
belongs_to :sentence_block
def story
@sentence_block = SentenceBlock.find(self.sentence_block_id)
Story.find(@sentence_block.story_id)
end
end
使用Story的show方法时会出现问题。 Story方法如下,并且还包括句子的相关show方法。
Sentence.show
def show
@sentence = Sentence.find(params[:id])
respond_to do |format|
format.html {redirect_to(@sentence.story)}
format.xml { render :xml => @sentence }
end
end
Story.show
def show
@story = Story.find(params[:id])
@sentence_block = @story.sentence_blocks.build
@new_sentence = @sentence_block.sentences.build(params[:sentence])
respond_to do |format|
if @new_sentence.content != nil and @new_sentence.sentence_block_id != nil and @sentence_block.save and @new_sentence.save
flash[:notice] = 'Sentence was successfully added.'
format.html # new.html.erb
format.xml { render :xml => @story }
else
@sentence_block.destroy
format.html
format.xml { render :xml => @story }
end
end
end
我收到了“找不到没有和id的Sentence_block”错误。所以我假设由于某种原因,sentence_block没有保存到数据库中。任何人都可以帮助我了解我的行为以及为什么我会收到错误?我试图确保每次视图描绘一个故事的节目时,不会创建不必要的sentence_block和句子,除非有人提交表单,我不确定如何实现这一点。任何帮助将不胜感激。
编辑,视图:
<p>
<b>Title:</b>
<%=h @story.title %>
<% @story.sentence_blocks.each do |b| %>
<% b.sentences.each do |s| %>
<br />
<%=h s.content %>
<% end %>
<% end %>
</p>
<% form_for @new_sentence do |s| %>
<p>
<%= s.label :sentence %><br />
<%= s.text_field :content %>
</p>
<p>
<%= s.submit "Create" %>
</p>
<% end %>
<%= link_to 'Edit', edit_story_path(@story) %>
<%= link_to 'Back', stories_path %>
答案 0 :(得分:1)
ruby-debug非常有用:
gem install ruby-debug
script/server --debugger
在show方法中设置@story后添加以下内容:
def show
@story = Story.find(params[:id])
debugger
@sentence_block = @story.sentence_blocks.build
然后转到/ stories / 1或您用于测试的任何ID,页面将无法完成加载,转到您用于服务器的终端,您将看到一个irb提示符。您可以从该提示中运行任意代码,您可以单步执行代码。非常有用。