新手问题 当 Rails 模型存在外键关系时,已经在模型中添加验证,如何在视图里如何添加错误提示

zerzerheart · 2015年12月25日 · 最后由 zerzerheart 回复于 2015年12月25日 · 2196 次阅读

用 rails 创建一个项目,有一个 Project 模型,有一个 Phase 模型,二者通过 project_id 关联在一起,现在在 Phase 模型中添加验证 phase.rb

class Phase < ActiveRecord::Base
  belongs_to :project
  validates :begin_time,:end_time,:lessons,:goal,:task,:resources,:name,:requirements,:presence => true 
end

在 views/phases/_form.html.erb 中

<%= form_for([@project,@project.phases.build]) do |f| %>
  <% if @project.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@project.errors.count, "error") %> 发生错误:</h2>

      <ul>
      <% @project.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
  <p>
  <%= f.label "阶段名称" %></br>
  <%= f.text_field :name %>
  </p>
........
<% end %>

我想问的是,在 views/phase/_form.html.erb 中

<% if ....errors.any? %>

应该怎么写, 我试过@project.phases,@phase,[@project,@project.phases.build],@project.phase 但是结果不是报错就是没效果,请教大家这里应该怎么写

试图 -> 视图?

#1 楼 @huacnlee 不好意思,太着急了,打错了

#1 楼 @huacnlee 前辈,请教您,这个应该怎么写啊

Controller 里面

def new
  @phase = @project.phases.new
end

View

<%= form_for([@project, @phase]) do |f| %>
  <% if @phase.errors.any? %>
     <div id="error_explanation">
....
<% end %>

你还得多读读 Rails Guides,方法不对,为何要在 View 里面 build 呢

#4 楼 @huacnlee 这个是照着 ruby on rails 指南里那个 blog 写的,它的在 article 里添加评论功能的时候是这么写的

<%= form_for([@article, @article.comments.build]) do |f| %>
  <p>
    <%= f.label :commenter %><br>
    <%= f.text_field :commenter %>
  </p>
  <p>
    <%= f.label :body %><br>
    <%= f.text_area :body %>
  </p>
  <p>
    <%= f.submit %>
  </p>
<% end %>

我也就照着写过来了

#4 楼 @huacnlee 前辈,我按照你的方法写了,页面上提示 First argument in form cannot contain nil or be empty

<h2>编辑阶段</h2>
<%= form_for([@project,@phase]) do |f| %>
  <% if @phase.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@phase.errors.count, "error") %> prohibited this project from being saved:</h2>

你不要抄我的代码,我告诉你的是思路,你 Copy 过去当然没法跑,因为我不知道你其他部分的代码是怎么写的。 我不知道 Ruby on Rails 指南是怎么写的,请以 Rails Guides 为准,再说了,那个指导和你需要实现的场景也不同,那个教程单独看是没错的,但你需要实现的东西不是那样可以搞出来的。

你需要掌握正确的 Rails 表单,Controller,验证等知识(姿势)

这个是 Rails Guide 的代码 http://guides.ruby-china.org/getting_started.html#%E7%94%9F%E6%88%90%E6%8E%A7%E5%88%B6%E5%99%A8

它这么写就是不打算用错误信息。要用错误信息就要把实例写到 Controller,不然 Template 每次都是拿到新对象 error 都是空的。

#7 楼 @huacnlee 谢谢前辈指教,我也感觉自己的 rails 基础不行,我要努力去学了,跟比自己厉害好多的人交流总是会有收获,谢谢您

#8 楼 @rei 原来是这样,所以要用错误信息,就要像华顺前辈那么写,对吧

#11 楼 @rei 恩恩,谢谢前辈指导

你得看完 Guides,多熟练才能搞清楚这个事情背后的原理以及原因,这些问题如果搞不懂,最好是跳过,等有天你熟悉了就懂了

有时候不一定非得要那么实现,可以换一个思路

千万不要让自己在学习的过程中卡在一个地方,那会有挫败感

所以我也不建议在遇到这类小问题的时候发帖求助,意义不大,太过简单,但说出来又很复杂,人家很难解释清楚或者不太愿意花时间给你详细解释。

反而你自己多研究研究,很容易搞通(不一定能理解,但至少能解决实际的问题),比如像我说的,换一条路子来实现

#13 楼 @huacnlee 嗯嗯,我会记住的,谢谢前辈

需要 登录 后方可回复, 如果你还没有账号请 注册新账号