【问题标题】:Drop Down List error Message not shown下拉列表错误消息未显示
【发布时间】:2015-04-16 18:28:25
【问题描述】:

所以我有 3 个级联下拉菜单和一个船模型(brand_idyear_idmodel_id)。错误未显示。我已经添加了;

  validates :brand_id, presence: true
  validates :year_id, presence: true
  validates :model_id, presence: true
  validates :user_id, presence: true

#boat.rb。我有我的表格;

<%= form_for(@boat) do |f| %>
    <%= render 'shared/error_messages', object: f.object %>
      <div class="col-md-6">
      <%= f.label :Brand %>
      <%= f.collection_select(:brand_id,  @brands,  :id, :name, {:prompt   => "Select a Brand"}, {:id => 'brands_select'}) %>
    </div>
    <div class="col-md-6">
      <%= f.label :Year %>
      <%= f.collection_select(:year_id, @years, :id, :name, {:prompt   => "Select a Year"}, {:id => 'years_select'}) %>
       </div>
      <div class="col-md-6">
      <%= f.label :Model %>
      <%= f.collection_select(:model_id, @models, :id, :name, {:prompt   => "Select a Model"}, {:id => 'models_select'}) %>
     </div>
      <div class="col-md-6 col-md-offset-3">
      <%= f.submit "Next", class: "btn btn-primary"%>
     </div>
    <% end %>

我有shared/errors

<% if object.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-danger">
      The form contains <%= pluralize(object.errors.count, "error") %>.
    </div>
    <ul>
    <% object.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>

该共享错误消息非常适合用户模型。还有我的#create 操作

def create
   @boat = current_user.boats.build(boat_params) if logged_in?
    if @boat.save
      flash[:success] = "Boat created!"
      redirect_to root_url
    else
      redirect_to new_boat_path(current_user) #returns here
    end
  end

我调用 new.html 并打开表单。当我按下而不选择任何内容时,它会重定向到new_boat_path(current_user) 而不会显示错误。我不知道为什么。

编辑1: 这是日志:

Started GET "/boats/new.2" for 88.240.3.128 at 2015-04-16 21:58:01 +0000
Processing by BoatsController#new as 
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 2]]
  Rendered shared/_error_messages.html.erb (0.0ms)

所以它呈现,但我在页面上看不到任何错误

编辑 2:#new 方法(品牌、年份和型号是级联下拉列表,其中船型号有其 id)

def new
    @boat = Boat.new
    @brands  = Brand.all
    @years = Year.all
    @models   = Model.all
  end

【问题讨论】:

    标签: ruby-on-rails render message


    【解决方案1】:

    您是 redirectingnew_boat_pathnew 操作创建了一个 Boat 的新实例,它显然不会包含任何错误。

    你可能想做的是:

    if @boat.save
      flash[:success] = "Boat created!"
      redirect_to root_url
    else
      render 'new'
    end
    

    这不会执行重定向,只会呈现包含@boat 变量的new 视图,其中包括调用@boat.save 创建的验证错误。

    【讨论】:

    • 我已经尝试过了,但是我得到了一个错误:NoMethodError in BoatsController#createundefined method map' for nil:NilClass`# should produce the desired results. def options_from_collection_for_select(collection, value_method, text_method, selected = nil) options = collection.map do |element| [value_for_collection(element, text_method), value_for_collection(element, value_method), option_html_attributes(element)] end selected, disabled = extract_selected_and_disabled(selected)
    • 我添加了新方法
    • 您需要再次设置@year、@brand 和@models... 但我建议直接在您的视图中设置这些。 &lt;%= f.collection_select(:brand_id, Brand.all, :id, :name, {:prompt =&gt; "Select a Brand"}, {:id =&gt; 'brands_select'}) %&gt;
    • 请记住...当您调用render 'new' 时,它不会调用控制器中的新操作。它只是呈现new 视图。因此,您需要重新设置视图所需的所有特定变量(在本例中为 @brands、@models、@year)。这有意义吗?
    • 是的,谢谢,我只在#new 控制器中留下了'@boat = Boat.new,并直接更改了collection_select。现在可以了。
    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 2014-06-19
    • 2013-09-27
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2014-08-09
    相关资源
    最近更新 更多