2017-04-01 65 views
0

我想驗證data模型,該模型爲belongs_to a project模型。驗證的工作原理是,如果驗證失敗,數據不會被保存。Rails在窗體上顯示驗證消息

但是,我無法獲得data驗證以顯示新窗體上驗證的正確錯誤消息。

如何在data表單上顯示正確的錯誤驗證消息?

表URL http://localhost:9080/projects/7/data/new

數據模型:

class Datum < ApplicationRecord 
    belongs_to :project 
    validates :supplier, :item, :presence => true #need this to display error message on data form 
end 

項目型號:

class Project < ApplicationRecord 
    belongs_to :user 
    validates :name,:presence => true #works perfectly, displays error message on project form 
    has_many :data, dependent: :destroy 
    accepts_nested_attributes_for :data 
end 

數據控制器

def create 
    @datum = Datum.new(datum_params) 
    @datum.project_id = params[:project_id] 

    respond_to do |format| 
    if @datum.save 
     format.html { redirect_to project_data_path, notice: 'Created.' } 
    else 
     format.html {#do I need something here to redisplay the form with the errors } 
    end 
    end 
end 

數據表:

<%= bootstrap_form_for([@project, @project.data.build]) do |f| %> 
    <div class="field"> 
    <%= f.text_field :supplier %> 
    </div> 

    <div class="field"> 
    <%= f.text_field :item %> 
    </div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

編輯 我到了一個解決方案最接近的是,如果該對象不保存:

format.html { redirect_to new_project_datum_path, alert: @datum.errors } 

但這ISN這正是我所需要的。因爲它只是返回錯誤消息,並且空字段使用戶必須再次填寫所有字段。 由於某些原因重定向工作,但render 'new'不起作用。

回答

2

如果無法保存,您應該呈現的「新」行動:

def create 
    @project = Project.find(params[:project_id]) 
    @datum = @project.build(datum_params) 

    respond_to do |format| 
    if @datum.save 
     format.html { redirect_to project_data_path, notice: 'Created.' } 
    else 
     format.html { render action: 'new' } 
    end 
    end 
end 

你也應該改變你的形式使用@datum實例變量,而不是構建它的形式:

<%= bootstrap_form_for([@project, @datum]) do |f| %> 

和控制器:

def new 
    @project = Project.find(params[:project_id]) 
    @datum = @project.data.build 
end 

其基本思想是,如果用戶到達新頁面時,您將創建一個新的空白基準實例變量。用戶填寫表單並將其發佈到創建操作。如果在創建操作中保存失敗,則保留填充的@datum對象並將其渲染回窗體。 @datum對象將出現錯誤(您可以通過@ datum.errors進行檢查),您可以向用戶顯示該錯誤。

+0

你知道我試過了,但它會拋出: 'nil:NilClass'的未定義方法'data',並突出顯示:'<%= bootstrap_form_for([@project,@project.data。build])do | f | %>' – HoosierCoder

+0

我在回答中添加了更多詳細信息 – kriskova

+0

當我在您的編輯中加入:#<#:0x007fc5ec4b44c0>的未定義方法'data_path',並突出顯示:'<%= bootstrap_form_for([@ project,@ datum])do | f | %>' – HoosierCoder