我能够在某种程度上完成我正在寻找的东西,但并不完全正确。当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
答案 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 %>