【问题标题】:Ruby on Rails: How would i stay on the same page if the post is not saved?Ruby on Rails:如果未保存帖子,我将如何留在同一页面上?
【发布时间】:2011-12-07 17:41:02
【问题描述】:
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,但我需要留在页面上,带有文本输入字段,以便用户输入数据。

发布模型

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 %>

我该怎么办?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1


    【解决方案1】:

    flash.nowrender 是您正在寻找的。​​p>

    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,但不适用于渲染!

    【讨论】:

    • 不,我想留在同一个帖子/新页面。使用渲染我得到了错误。 NoMethodError in Posts#create Showing /path/to/app/views/posts/new.html.erb where line #10 raise: 你有一个 nil 对象,但你没想到!您可能期望有一个 Array 的实例。评估 nil.map 时发生错误,我已更新原始帖子/问题,请再次查看以了解。
    • redirect 会丢失包含所有错误的临时@post 变量。
    • 看起来您的new.html.erb 模板正在使用@post 变量,该变量在控制器的create 方法中不存在。将@addpost 重命名为@post,它应该可以工作。
    • 你从哪里得到@post 变量?在 new.html.erb 中没有使用 post 变量
    • @guru 抱歉没有看到编辑。您正在使用 @categories_select,这在 create 方法中不可用。 render 只渲染模板,它不执行控制器动作,所以这两个实例方法都没有设置。
    【解决方案2】:

    这样的事情应该做你想做的事:

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

    更新:你更新了你的问题,所以我必须更新我的答案。渲染正确的方式来做到这一点。但是,看起来您在 new 方法中加载了一些类别和一些其他内容集合。您的create 方法应该可以使用这些相同的实例变量。最干净的方法是将它们放入另一个方法中,并将该方法用作before_filter 应用于createnew。像这样的:

    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 方法几乎是空白的,在您的 create 方法中调用 render :new 应该可以工作。

    【讨论】:

    • 不渲染,而是我使用了这个,redirect_to new_post_path,看起来还可以。使用渲染我得到了错误。 NoMethodError in Posts#create Showing /path/to/app/views/posts/new.html.erb where line #10 raise: 你有一个 nil 对象,但你没想到!您可能期望有一个 Array 的实例。评估 nil.map 时发生错误
    • 好吧,重定向很糟糕,因为您丢失了用户需要查看的错误列表,以确定他们的新用户出了什么问题。所以......而不是重定向所以错误消失......让我们实际修复错误。 :) 你能在 new.html.erb 的第 10 行提供代码吗
    • 你能展示你的“新”吗?我认为它可能正在渲染 new.html.erb 模板,其中包含(可能)一个 post 变量或其他东西。如果是这种情况,您可能希望将 addpost 重命名为 post。不过,如果没有看到您的“新”功能,很难说出确切的问题是什么。
    • 我已经更新了原始帖子/问题。再看一遍就明白了。
    • 我的答案仍然是正确的方法。更新后希望能更清楚地说明原因。
    【解决方案3】:

    嘿,这个答案太晚了,但我想我会为遇到它的任何人添加它。对于您想要实现的目标,最简单的解决方案可能是在您想要填写的所有表单输入中添加 required: true 。例如

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

    只有在正确填写这些字段时才会提交表单,否则会在需要填写的字段上弹出错误消息。弹出的默认 Flash 消息也可以自定义样式,谷歌如何做到这一点。

    这样你可以在你的create方法中删除else重定向,因为它永远不会到达那个点,只需要if保存、flash成功等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 2015-04-09
      • 2013-09-09
      • 2012-10-23
      相关资源
      最近更新 更多