错误不适用于Index视图中的表单

时间:2010-11-25 18:54:16

标签: ruby-on-rails ruby-on-rails-3

我正在尝试在Index视图中创建一个对象表单,一切顺利,但是当保存失败(验证错误)时,错误将不会显示在屏幕上。

这是我的链接控制器

class LinksController < ApplicationController


respond_to :html

def index
    @link = Link.new
    @links = Link.all
end

def create
    @link = Link.new(params[:link])
    flash[:notice] = "Link was found successfully." if @link.save
    respond_with(@link)
end

def show
    respond_with(@link = Link.find(params[:id]))
end

def statistics

end
end

这是错误出现的部分形式

<h1>New Search</h1>
<%= form_for(@link) do |f| %>           

<% if @link.errors.any? %>
    <div id="error_explanation">
        <h2><%= pluralize(@link.errors.count, "error") %> prohibited this ticket from being saved:</h2>

        <ul>
            <% @link.errors.full_messages.each do |msg| %>
            <li><%= msg %></li>
            <% end %>
        </ul>
    </div>
<% end %>

<p><b><%= f.label(:original, "URL") %></b>
<%= f.text_field :original %></p>

<p><%= f.submit('Find Link') %></p>

<% end %>

当我创建一个新对象并且原始文件有效时,一切顺利,但是当它不是我得到的时候:

缺少模板

缺少模板链接/ new与{:formats =&gt; [:html],:locale =&gt; [:en,:en],:handlers =&gt; [:erb,:builder,:rjs,:rhtml ,:rxml]}在视图路径中

当他得到错误时似乎要求新的,但我希望它去索引,并在那里显示错误。我尝试用下面的代码回复,但它也没有用。

respond_with(@link) do |format|
            format.html { render :action => 'index'}
end

同样是我的index.html.erb,它会加载表单部分和最近部分

<%= render 'form' %>

<%= render 'recent' %>

_recent.html.erb

<h1>Recent Finds</h1>

<table>
    <tr>
        <th>URL</th>
        <th>Link</th>
        <th>Service</th>
    </tr>

<% @links.each do |link| %>
    <tr>
        <td><%= link.original %></td>
        <td><%= link.link %></td>
        <td><%= link.site %></td>
    </tr>
<% end %>

</table>

关于我可以在这做什么的任何想法?

3 个答案:

答案 0 :(得分:0)

<% if f.error_messages.blank? %>
    content when there are error messages
<% end %>

这是我在2.3.8中所做的

答案 1 :(得分:0)

无论保存是否成功,您的create方法都会使用params构造您的对象进行响应。你可能想要这样的东西:

def create
  @link = Link.new(params[:link]
  if @link.save
    respond_with(@link, :notice => "Yay!")
  else
    redirect_to(links_path, :alert => "Nay!")
  end
end

答案 2 :(得分:0)

如果它给你一个像Template is missing这样的错误,这意味着在执行创建操作时,如果没有保存记录,它会尝试渲染不存在的“新”页面。

我对respond_with没有太多了解,我们如何覆盖其行为失败的行为,但您可以编写如下代码:


def create
  @link = Link.new(params[:link])
  if @link.save  
    flash[:notice] = "Link was found successfully." 
    respond_with(@link)
  else
   @links = Link.all
   render :action => :index
  end
end

要显示错误消息,您可以编写以下条件:

<% unless @link.valid? %>
put your content to display error messages here <% end %>