2016-07-27 10 views
0

Ich habe eine Simple_form mit einer gruppierten Sammlung auswählen und zwei Eingabefelder. Ich habe eine Pflicht: wahr auf beiden Feldern, aber es erlaubt immer noch leere Eingabe durch. Das kleine "erforderliche" Sternchen erscheint neben dem Feldnamen, aber das war's. Kann ich irgendwie verhindern, dass leere Eingaben das Formular durchlaufen?Schienen 'erforderlich: True' funktioniert nicht vollständig

new.rb

<h1>New Article</h1> 

<%= render 'form', article: @article %> 

<%= link_to 'Back', articles_path(category_id: params[:category_id]) %> 

_form.rb

<%= simple_form_for(article, html: {class: 'form-vertical'}) do |f| %> 
    <% if article.errors.any? %> 
    <div id="error_explanation"> 
     <h4><%= pluralize(article.errors.count, "error") %> prohibited this article from being saved:</h4> 

     <ul> 
     <% article.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 

    <%# field being selected, parent collection, subcollection, displayed, key, value %> 
    <%= f.grouped_collection_select :subcategory_id, Category.all,:subcategories,:name, :id,:name, {required: true} %> 
    <%= f.input :title, required: true %> 
    <%= f.input :content, input_html: { rows: 20 }, required: true%> 
    </div> 

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

articles_controller.rb

class ArticlesController < ApplicationController 
    before_action :set_article, only: [:show, :edit, :update, :destroy] 

    # GET /articles 
    # GET /articles.json 
    def index 
    if params[:category_id].blank? && params[:subcategory_id].blank? 
     @articles = Article.all.order("created_at DESC") 
    elsif params[:subcategory_id].blank? 
     @articles = Article.where(category_id: params[:category_id]) 
    else 
     @articles = Article.where(subcategory_id: params[:subcategory_id]).order("created_at DESC") 
    end 
    end 

    # GET /articles/1 
    # GET /articles/1.json 
    def show 
    end 

    # GET /articles/new 
    def new 
    @article = Article.new 
    end 

    # GET /articles/1/edit 
    def edit 
    end 

    # POST /articles 
    # POST /articles.json 
    def create 
    @parameters = article_params 
    @parameters[:category_id] = Subcategory.find(@parameters[:subcategory_id]).category_id 
    @article = Article.new(@parameters) 

    respond_to do |format| 
     if @article.save 
     format.html { redirect_to @article, notice: 'Article was successfully created.' } 
     format.json { render :show, status: :created, location: @article } 
     else 
     format.html { render :new } 
     format.json { render json: @article.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /articles/1 
    # PATCH/PUT /articles/1.json 
    def update 
    respond_to do |format| 
     if @article.update(article_params) 
     format.html { redirect_to @article, notice: 'Article was successfully updated.' } 
     format.json { render :show, status: :ok, location: @article } 
     else 
     format.html { render :edit } 
     format.json { render json: @article.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /articles/1 
    # DELETE /articles/1.json 
    def destroy 
    @article.destroy 
    respond_to do |format| 
     format.html { redirect_to root_path, notice: 'Article was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_article 
     @article = Article.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def article_params 
     params.require(:article).permit(:title,:content,:subcategory_id) 
    end 
end 
+0

fügen Sie einfach 'validates_presence_of: something' zu' Article' Modell (Titel, Inhalt, usw.) – marmeladze

Antwort

0

Sie müssen Validierungen verwenden, wird diese Logik innerhalb des Modells. Stellen Sie sicher, dass Sie die ActiveRecord Validations Guide lesen und verstehen, da Sie dadurch viel Zeit sparen. Beispiel aus der Führung genommen:

class Person < ApplicationRecord 
    validates :name, presence: true 
end 



Person.create(name: "John Doe").valid? # => true 
Person.create(name: nil).valid? # => false 

Grundsätzlich, wenn das Objekt gespeichert wird, läuft er die Validierungen und wenn es nicht gültig ist wird es die Fehler Variable mit den Nachrichten füllen.

+0

Richtig, das habe ich nicht gemacht. Vielen Dank! – Alex

0

Einfache Form Dokumentation Staaten ...

standardmäßig alle Eingaben erforderlich sind. Wenn das Formularobjekt die Anwesenheit Validierungen an seine Felder angehängt hat, teilt Simple Form erforderlich und optionale Felder auseinander. Aus Performancegründen wird diese Erkennung bei Validierungen übersprungen, die bedingte Optionen verwenden, z. B. : if und: own.

was bedeutet, dass alles, was Sie brauchen, ist in das Modell/article.rb zu tun, Datei hinzufügen

class Article < ActiveRecord::Base 

    validates :title, presence: true 
    validates :content, presence: true 
Verwandte Themen