Подтвердить что ты не робот

Ruby on Rails: Как я останусь на той же странице, если сообщение не будет сохранено?

def create
    @addpost = Post.new params[:data]
    if @addpost.save
        flash[:notice] = "Post has been saved successfully."
        redirect_to posts_path
    else
        flash[:notice] = "Post can not be saved, please enter information."
    end
end

Если сообщение не сохранено, оно перенаправляется на http://0.0.0.0:3000/posts, но мне нужно оставаться на странице с полями ввода текста, поэтому этот пользователь может вводить данные.

post model

class Post < ActiveRecord::Base

    has_many :comments
    validates :title, :presence => true
    validates :content, :presence => true
    validates :category_id, :presence => true
    validates :tags, :presence => true
end

новый метод

def new
    @arr_select = { 1=>"One",2=>"Two" ,3=>"Three" }
    @categories_select = Category.all.collect {|c| [ c.category_name, c.id ] }
end

new.html.erb

<h3>Add post</h3>

<%= form_tag :controller=>'posts', :action=>'create' do %>
    <%= label :q, :Title %>
    <%= text_field :data, :title, :class => :addtextsize %><br/>
    <%= label :q, :Content %>
    <%= text_area  :data, :content, :rows=>10 , :class => :addtextarea %><br/>
    <%= label :q, :Category %>
    <%= select :data, :category_id, @categories_select %><br/>
    <%= label :q, :Tags %>
    <%= text_field :data, :tags, :class => :addtextsize %><br/>
    <%= label :q, :Submit %>
    <%= submit_tag "Add Post" %>
<% end %>

Что мне делать?

4b9b3361

Ответ 1

flash.now с render - это то, что вы ищете.

flash.now[:notice] = "Post can not be saved, please enter information."
render :new

Также вместо

flash[:notice] = "Post has been saved successfully."
redirect_to posts_path

вы можете просто написать

redirect_to posts_path, :notice => "Post has been saved successfully."

и он сделает то же самое. Он работает только с redirect_to, но не с рендером!

Ответ 2

Что-то вроде этого должно делать то, что вы хотите:

flash[:notice] = "Post can not be saved, please enter information."
render :new

ОБНОВЛЕНИЕ. Вы обновили свой вопрос, поэтому мне нужно обновить свой ответ. Render - правильный способ сделать это. Однако, похоже, что вы загружаете некоторые категории и некоторые другие материалы в свой метод new. Те же самые переменные экземпляра должны быть доступны вашему методу create. Самый чистый способ сделать это - поместить их в другой метод и использовать этот метод как before_filter для create и new. Что-то вроде этого:

before_filter :load_stuff, :only => [:create, :new]

def load_stuff
  @arr_select = { 1=>"One",2=>"Two" ,3=>"Three" }
  @categories_select = Category.all.collect {|c| [ c.category_name, c.id ] }
end

Затем ваш метод new довольно пуст, и вызов render :new в вашем методе create должен работать.

Ответ 3

Эй, этот ответ слишком поздний, но я подумал, что добавлю его для всех, кто сталкивается с этим. Вероятно, самым простым решением для того, что вы хотите достичь, является добавление требуемого: true для всех входных данных формы, которые вы хотите заполнить. Например,

f.text_field :title, required: true, class: "whateverclassyouwant" 

Таким образом, форма будет отправлена ​​ТОЛЬКО, только если эти поля были заполнены правильно, и если в поле, которое должно быть завершено, появится сообщение об ошибке. По умолчанию всплывающие флэш-сообщения по умолчанию могут быть также настроены в обычном стиле, Google, как это сделать.

Таким образом вы можете удалить перенаправление else вместе в своем методе создания, так как оно никогда не дойдет до этой точки, и просто иметь возможность сохранения, флэш-успеха и т.д.