2015-07-20 76 views
0

型号:为什么不验证该字段?

class Video < ActiveRecord::Base 
    belongs_to :user 

    validates :title, presence: true 
end 

class User < ActiveRecord::Base 
    devise :database_authenticatable, 
      :registerable, 
      :recoverable, 
      :rememberable, 
      :trackable, 
      :validatable 
    has_many :videos 
end 

路线:

devise_for :users 

    resources :users do 
    resources :videos 
    end 

    get 'persons/profile', as: 'user_root' 

形式:

<%= form_for [current_user, @video] do |f| %> 
    <%= f.text_field :title %> 
    <%= f.file_field :video %> 
    <%= f.submit %> 
<% end %> 

视频控制器:

def new 
    @video = Video.new 
    end 

     def create 
     p '---------------------' 
     p current_user 
     p '==================' 

     if params[:video][:video] 
      filename = params[:video][:video].original_filename 
     else 
      filename = nil 
     end 

     video = current_user.videos.create(
              title: params[:video][:title], 
              filename: filename 
     ) 
     if video.save 
      flash[:success] = :post_saved 
      redirect_to user_videos_path(current_user) 
     else 
      flash.now[:error] = :post_not_saved 
      render 'new' 
     end 
     end 

     def video_params 
     params.require(:video).permit(:title, :video) 
     end 

如果我发送的形式与填充字段'title',那么记录就会被添加到数据库中。但是,如果我的形式发送到空场“标题”,我收到以下错误信息:

ArgumentError in Videos#create Showing /home/kalinin/rails/vd/app/views/videos/_form.html.erb where line #1 raised: First argument in form cannot contain nil or be empty

控制台显示以下内容:

Started POST "https://stackoverflow.com/users/48/videos" for 127.0.0.1 at 2015-07-20 14:48:47 +0300 
Processing by VideosController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"QgbvXiEIU33kuz6FE0t3MrQIWyothpbQ0/FUBHCCRC2peYpDucO8sQ5zBD1obVe4H26kQVuTjK83GyQDl6zrXA==", "video"=>{"title"=>""}, "commit"=>"Create Video", "user_id"=>"48"} 
"---------------------" 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 48]] 
#<User id: 48, email: "[email protected]", encrypted_password: "$2a$10$8h2xqDP8/eShIzfeX5tqJuqisHKiWqDydgpBJiS/xi0...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2015-07-20 10:55:26", last_sign_in_at: "2015-07-20 10:55:26", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2015-07-20 10:55:25", updated_at: "2015-07-20 10:55:26", status_id: 0, name: "zz", info: nil> 
"==================" 
    (0.1ms) BEGIN 
    (0.1ms) COMMIT 
    (0.1ms) BEGIN 
    (0.1ms) ROLLBACK 
    Rendered videos/_form.html.erb (1.1ms) 
    Rendered videos/new.html.erb within layouts/application (1.5ms) 
Completed 500 Internal Server Error in 10ms (ActiveRecord: 0.6ms) 

ActionView::Template::Error (First argument in form cannot contain nil or be empty): 
    1: <%= form_for [current_user, @video] do |f| %> 

回答

4

您还没有初始化/在create动作定义@video,由于其发生错误时,它试图使“新”的模板,并得到@videonil

尝试更新create行动如下:

... 

@video = current_user.videos.build(
            title: video_params[:title], # use your whitelist 
            filename: filename 
     ) 

if @video.save 

... 
+0

等一等,什么叫点'.save',当模型已经'.create'd?作为结果的额外往返数据库。 –

+0

@ D-side你是对的,除了原始问题的答案,这是OP需要做的另一个改进。谢谢,更新的答案 – RAJ

1

更改create动作

def create 
    p '---------------------' 
    p current_user 
    p '==================' 

    if params[:video][:video] 
     filename = params[:video][:video].original_filename 
    else 
     filename = nil 
    end 

    @video = current_user.videos.create(
             title: params[:video][:title], 
             filename: filename 
    ) 
    if @video.save 
     flash[:success] = :post_saved 
     redirect_to user_videos_path(current_user) 
    else 
     flash.now[:error] = :post_not_saved 
     render 'new' 
    end 
    end 

无论你在哪里video变化@video