rails和保存到数据库的问题

时间:2010-04-03 01:12:56

标签: ruby-on-rails

我在理解问题根源方面遇到了一些困难。 下面是模型类的列表。基本上,目标是能够在故事结尾添加句子,或者将故事添加到现有的句子中。现在,我只是试图允许用户添加句子,并自动为新句子创建一个新的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 %>

1 个答案:

答案 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提示符。您可以从该提示中运行任意代码,您可以单步执行代码。非常有用。