2015-07-20 85 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