【问题标题】:Simple validates_length_of yields unexpected NoMethodError简单的 validates_length_of 产生意外的 NoMethodError
【发布时间】:2010-08-13 06:16:43
【问题描述】:

我有一个消息表单,它在模型中使用 validates_length_of 来限制消息的长度。

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 %>
....

消息#index:

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 -%>

我不确定这里到底发生了什么。任何帮助将不胜感激(即使是部分重构)。感谢您阅读我的问题。

【问题讨论】:

  • 你在哪里声明你的@messages 变量?那就是提高零的那个
  • @messages 在messages#index 中。我更新了问题以显示该代码。

标签: ruby-on-rails validation model controller


【解决方案1】:

嗨,当您输入 5k 左右的字符时,Message 将变为无效记录,因此创建有效的else 条件

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

你在这里渲染render 不会在操作中执行代码它只是用你当前的数据渲染文本文件你没有在你的create 操作中分配@messages(我想你也没有这样做在new) 所以它是nil 当你渲染index 您应该在 newcreate 内初始化它或将 render 'index' 更改为 render 'new'

【讨论】:

  • 谢谢,不知道为什么改成index了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多