如何在表单创建尝试中显示相关表中的错误

时间:2015-03-01 16:40:49

标签: ruby-on-rails forms

我能够在某种程度上完成我正在寻找的东西,但并不完全正确。当defualt"选择订阅时保存表单"文本被选中永远不会正确。我有一个从相关数据库中提取选择的表单:

<%= form_for [current_user, @subscription] do |f| %>
  <% if @subscription.errors.any? %>
    <div class="error_messages">
      <h2>Form is invalid</h2>
      <ul>
        <% for message in @subscription.errors.full_messages %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>
  <p>
    <%= f.label :subscription_types, "Subscription Type" %><br />
    <%= f.collection_select :subscription_type_id, @subscription_types, :id, :type_name, :prompt => "Select a subscription" %>
  </p>
  <p class="button"><%= f.submit %></p>
<% end %>

我有一个验证相关id

的模型
class Subscription < ActiveRecord::Base
    belongs_to :subscription
    belongs_to :subscription_type

validates_presence_of :subscription_type_id, :on => :create, :message => "You need to select a subscription type"
end

当我尝试保存表单并调用create动作时,当前代码返回打印到屏幕的嵌套数组。最初,我有&#34; redirect_to&#34;方法设置为new,但我不认为它正在运行新操作并建立变量。我设置为redirect_to以便查看操作详细信息,但现在错误设置不正确。我觉得我可以通过足够的修补来获得我需要的东西,但有没有一种好方法可以将这些消息拉出来?

class SubscriptionsController < ApplicationController
    def new
        puts "FAAAAAAAAAAAART-2"
        @subscription = Subscription.new
        @subscription_types = SubscriptionType.all
        puts @subscription_types 
        puts "FAAAAAAAAAAAART-3"
    end

    def create
        @subscription = Subscription.new(subscription_params)
        @user = User.find(session[:user_id])
        @subscription.user_id = @user.id
        if @subscription.save
            redirect_to root_url, :notice => "Subscription Created!"
        else
            puts "FAAAAAAAAAAAART-1"
            flash[:error] = @subscription.errors.messages.values()
            redirect_to action: :new
        end
    end

    private

    def subscription_params
        params.require(:subscription).permit(:subscription_type_id)
    end
end

1 个答案:

答案 0 :(得分:1)

在您的create操作中,您需要更改失败的分支,如下所示:

def create
  ...

  if @subscription.save
    redirect_to root_url, :notice => "Subscription Created!"
  else
    flash[:error] = @subscription.errors.full_messages
    @subscription_types = SubscriptionType.all
    render :new
  end
end

请注意,redirect_to执行完全重定向,启动新的HTTP请求,您不会在其中提供任何数据,因此不会显示任何错误。这只是一个刚刚开始的形式。使用render,您只需再次呈现模板,其中包含您在create操作中初始化和处理的所有变量。

在旁注中,for in在Ruby中不是很常见的语法。我建议您({3}}和Ruby样式指南(深入)查看。您可以在模板上重写显示如下代码的错误:

<%- @subscription.errors.full_messages.each do |message| %>
  <li><%= message %></li>
<% end %>