【问题标题】:Rails throwing error instead validatingRails 抛出错误而不是验证
【发布时间】:2017-07-13 15:09:19
【问题描述】:

我正在构建一个相当简单的 Rails 5 应用程序。您创建“电影”,然后可以为这些电影创建“评论”。 Rails 正在做一些奇怪的事情。我已经设置了我的应用程序,因此我没有“新”操作和相应的视图,而是在 application.html.erb 文件中包含的模式中创建新电影的表单。然后我在控制器中为所有电影视图提供@newmovie = Movie.new,因此数据在任何地方都可用。

我有这样的电影对象设置验证:

 class Movie < ApplicationRecord
   has_many :reviews 
   validates :title, :director, :poster, :synopsis, presence: true
 end

当我填写表单以在索引视图的模态中创建新电影并故意将字段留空(以触发验证)时,我得到:

而不是表单根本不接受输入。这里发生了什么?我不能像这样发生这个错误。以前,我有一个“新”的看法。这在以前的设置中没有发生。救命!

这是我的整个电影控制器:

class MoviesController < ApplicationController

    before_action :find_movie, only: [:show, :edit, :update, :destroy ]
    before_action :authenticate_user!, only: [:new, :create, :edit, :update, :destroy]
    before_action :find_newmovie, only: [:show, :index, :new, :edit]

    def show
        @reviews = @movie.reviews.all.order(created_at: :desc).paginate(:page => params[:page], :per_page => 3)
        @review = Review.new
        if @movie.reviews.blank?
            @average_review = 0
        else
            @average_review = @movie.reviews.average(:rating).round(2)
        end
    end 

    def index 
        @movies = Movie.all.order(title: :asc).paginate(:page => params[:page], :per_page => 3)
        @newmovie = Movie.new
    end 

    def new
        @movie = Movie.new
    end 

    def create
        @movie = Movie.create(movie_params)
        @movie.user_id = current_user.id
        if @movie.save
            flash[:success] = "Your movie was created!"
            redirect_to root_path
        else
            flash[:danger] = "There was a problem with your request"
            render :new 
        end 
    end 

    def edit

    end 

    def update 
        if @movie.update(movie_params)
            flash[:success] = "Your movie was updated"
            redirect_to movie_path 
        else 
            flash[:danger] = "There was a problem with your request"
        end
    end 

    def destroy 
        if @movie.destroy
            flash[:success] = "Your movie was removed"
            redirect_to movies_path 
        else 
            flash[:danger] = "There was a problem with your request"
            render :index
        end 
    end 

    private 

        def movie_params 
            params.require(:movie).permit(:title, :director, :poster, :synopsis, :user_id)
        end 

        def find_movie 
            @movie = Movie.find(params[:id])
        end 

        def find_newmovie
            @newmovie = Movie.new
        end

end

【问题讨论】:

  • 您需要创建一个电影的新实例,然后才能在表单中使用它并将其分配给@newmovie。这应该发生在你的控制器中的某个地方。
  • 需要知道您的路线设置。您的失败表格是来自new 还是index?不清楚...如果new,那么您没有在new 方法中设置@newmovie

标签: ruby-on-rails validation


【解决方案1】:

movies_controllernew 操作中,您错过了初始化实例变量@newmovie

movies_controller中添加以下代码:

  class MoviesController < ApplicationController
    def new
      @newmovie = Movie.new
    end
   ...
  end

【讨论】:

  • 我其实已经有了。我稍微更新了问题以包含它。
  • 好了。感谢您的帮助。
  • 试试&lt;%= form_for Movie.new do |m| %&gt;
  • @JSeabolt 投票并接受我的回答,如果对您有帮助的话。谢谢
  • 是的,答案是 谢谢先生。
猜你喜欢
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
  • 2013-04-10
相关资源
最近更新 更多