2010-08-13 49 views
0

我有一個消息形式,它在模型中使用validates_length_of來限制消息的長度。簡單的validates_length_of產生意想不到的NoMethodError

validates_length_of :content, :maximum => 1024 

我通過輸入5k左右的字符並提交表單「測試」了這一點。但是,我得到這個NoMethodError:

NoMethodError in Messages#create 

Showing app/views/messages/_messages.html.erb where line #1 raised: 

You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.each 
Extracted source (around line #1): 

1: <%- for message in @messages -%> 
2: <div class="message"> 
3:  <%= link_to message.title, message %> 
.... 

消息#指數:

def index 
    @title = "chat" 
    @messages = Message.paginate :page => params[:page], :per_page => 8, :order => "updated_at DESC" 
    respond_to do |format| 
    format.html 
    end 
end 

消息#創建:

def create 
    @message = Message.new(params[:message]) 
    respond_to do |format| 
    if @message.save 
     record_post_time 
     flash[:notice] = "Created \"#{@message.title}\"" 
     format.html { redirect_to(messages_url) } 
    else 
     format.html { render :action => "index" } 
    end 
    end 
end 

_messages.html.erb:(超級難看,並且需要大重構)

<%- for message in @messages -%> 
    <div class="message"> 
    <%= link_to message.title, message %> 

    <%- if message.name.empty? -%> 

    <%- else -%> 
     <span class="name"> 
     by 
     <%- if message.email.blank? -%> 
      <%=h message.name %> 
     <%- else -%> 
      <a href="mailto:<%= message.email %>"><%=h message.name %></a> 
     <%- end -%> 
     </span> 
    <%- end -%> 

    <span class="time"> 
     active &#32;<%= timeago(message.updated_at) %> 
    </span> 

    <%- if message.comments.empty? -%> 
     <span class="reply"> 
     <%= link_to 'reply', :controller => 'messages', :action => 'show', :id => message %> 
     </span> 
    <% else %> 
     <span class="reply"> 
     <%= link_to pluralize(message.comments.count, 'reply'), :controller => 'messages', :action => 'show', :id => message %> 
     </span> 
    <%- end -%> 

    <p><%= sanitize message.content, 
:tags => %w(a embed img object p param), 
:attributes => %w(allowfullscreen allowscriptaccess href name src type value) %></p> 

    <% unless controller.controller_name == "tags" %> 
     <%- unless message.tag_list.nil? || message.tag_list.empty? -%> 
     <% message.tags.each do |t| %> 
      <div class="tag"><%= link_to t.name.titleize, tag_path(t) %></div> 
     <% end %> 
     <%- end -%> 
    <% end %> 

    <%- unless message.comments.empty? -%> 
     <div class="comments"> 
     <%= render :partial => message.firstcomments %> 
     <%- if message.comments.count >= 4 -%> 
      <%= link_to 'more...', :action => 'show', :id => message %> 
     <%- end -%> 
     </div> 
    <%- end -%> 
    </div> 
<%- end -%> 

我不確定什麼樣的這裏正在進行。任何幫助將不勝感激(即使部分重構)。感謝您閱讀我的問題。

+0

你在哪裏聲明你的@messages變量?這是一個沒有提出的問題 – corroded 2010-08-13 06:21:35

+0

@messages在消息#索引中。我更新了該問題以顯示該代碼。 – BasicObject 2010-08-13 06:32:07

回答

1

喜當你進入5K左右的字符Message變得無效記錄等工作創造條件else

else 
    format.html { render :action => "index" } 
end 

你呈現這裏render不執行代碼裏面的動作,它只是呈現的文本文件與您當前的數據你還沒有指定@messagescreate行動中(我想你也new還沒有這樣做的話),所以當你渲染indexnil你應該初始化它裏面newcreate或改變render 'index'render 'new'

+0

謝謝,我不確定爲什麼它被改爲索引。 – BasicObject 2010-08-13 21:38:23

相關問題