我无法在 sqlite 中保存记录 Rails
I can't save record in sqlite Rails
我尝试在数据库中保存记录,在 pivot table 但如果我写 @video.category_ids = 1
我有一个错误(屏幕),它有效但数据库中的类别 id = 1
下面是我的代码,如果您需要更多信息,请写信。
videos_controller.rb
class VideosController < ApplicationController
layout 'master'
before_action :chceck_login
def index
@videos = Video.sortASC
end
def new
@categories = Category.all
end
def create
@video = Video.new(video_params)
@video.category_ids = [video_params]
if @video.save
flash[:notice] = 'The movie has been added successfuly'
redirect_to(:action => 'index')
else
@categories = Category.all
render('new')
end
end
def show
end
def edit
end
def delete
end
private
def video_params
params.require(:video).permit(:title, :url, :description, category_attributes: [:id]).merge(user_id: session[:user_id])
end
end
_form_html.erb
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" id="basic-addon1"><i class="fas fa-tag"></i></span>
</div>
<%= f.text_field :title, placeholder: 'Title', :class => 'form-control', :id => 'title' %>
</div>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" id="basic-addon1"><i class="fas fa-link"></i></span>
</div>
<%= f.text_field :url, placeholder: 'URL', :class => 'form-control', :id => 'url' %>
</div>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" id="basic-addon1"><i class="fas fa-edit"></i></span>
</div>
<%= f.text_area :description, placeholder: 'Description', rows: 5, :class => 'form-control', :id => 'description' %>
</div>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" id="basic-addon1"><i class="fas fa-sitemap"></i></span>
</div>
<%= f.select(:category_id, @categories.map{|t| [t.name, t.id]}, {}, :multiple => true, :class => 'custom-select') %>
</div>
video.rb
class Video < ApplicationRecord
belongs_to :user
has_and_belongs_to_many :categories
scope :sortASC, lambda{order("videos.created_at ASC")}
end
new.html.erb
<% @page_title = 'Add Film' %>
<div class='container'>
<div class='row'>
<div class='col s-6'>
<div class="jumbotron jumbotron-fluid bg-info">
<div class="container">
<h1 class="display-4 text-center">ADD NEW FILM <i class="fas fa-plus"></i></h1>
<p class="lead">This is a modified jumbotron that occupies the entire horizontal space of its parent.</p>
</div>
</div>
</div>
<div class='col s-6'>
<%= form_for(:video, :url => {:action => 'create'}) do |f| %>
<%= render(:partial => 'form', :locals => {:f => f}) %>
<%= submit_tag('Add Film', :class => 'btn btn-primary float-right') %>
<% end %>
</div>
</div>
</div>
如果你愿意,我已经把我的项目放在 Github 上了。
我建议进行以下更改:
在_form.html.erb中将select的名字复数,即改成
<%= f.select(:category_id, @categories.map{|t| [t.name, t.id]}, {}, :multiple => true, :class => 'custom-select') %>
至
<%= f.select(:category_ids, @categories.map{|t| [t.name, t.id]}, {}, :multiple => true, :class => 'custom-select') %>
中videos_controller.rb改
def video_params
params.require(:video).permit(:title, :url, :description, category_attributes: [:id]).merge(user_id: session[:user_id])
end
至
def video_params
params[:video][:category_ids].reject!(&:blank?) unless params[:video][:category_ids].nil?
params.require(:video).permit(:title, :url, :description, category_ids: []).merge(user_id: session[:user_id])
end
也在videos_controller.rb移除
@video.category_ids = [video_params]
把事情留给构造函数
关于 2。我不是 100% 确定确切的解决方案,也许你也应该拒绝参数中的空 ID(根据提供的屏幕截图,为此使用 .reject!(&:blank?)
)- 对于分析进一步的问题,在将 video_params
函数的输出传递给构造函数之前检查它的输出 - 它基本上应该看起来像预期对象的哈希表示。
edit 更新了关于 category_ids
的 2 的更改建议
我尝试在数据库中保存记录,在 pivot table 但如果我写 @video.category_ids = 1
我有一个错误(屏幕),它有效但数据库中的类别 id = 1
下面是我的代码,如果您需要更多信息,请写信。
videos_controller.rb
class VideosController < ApplicationController
layout 'master'
before_action :chceck_login
def index
@videos = Video.sortASC
end
def new
@categories = Category.all
end
def create
@video = Video.new(video_params)
@video.category_ids = [video_params]
if @video.save
flash[:notice] = 'The movie has been added successfuly'
redirect_to(:action => 'index')
else
@categories = Category.all
render('new')
end
end
def show
end
def edit
end
def delete
end
private
def video_params
params.require(:video).permit(:title, :url, :description, category_attributes: [:id]).merge(user_id: session[:user_id])
end
end
_form_html.erb
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" id="basic-addon1"><i class="fas fa-tag"></i></span>
</div>
<%= f.text_field :title, placeholder: 'Title', :class => 'form-control', :id => 'title' %>
</div>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" id="basic-addon1"><i class="fas fa-link"></i></span>
</div>
<%= f.text_field :url, placeholder: 'URL', :class => 'form-control', :id => 'url' %>
</div>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" id="basic-addon1"><i class="fas fa-edit"></i></span>
</div>
<%= f.text_area :description, placeholder: 'Description', rows: 5, :class => 'form-control', :id => 'description' %>
</div>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" id="basic-addon1"><i class="fas fa-sitemap"></i></span>
</div>
<%= f.select(:category_id, @categories.map{|t| [t.name, t.id]}, {}, :multiple => true, :class => 'custom-select') %>
</div>
video.rb
class Video < ApplicationRecord
belongs_to :user
has_and_belongs_to_many :categories
scope :sortASC, lambda{order("videos.created_at ASC")}
end
new.html.erb
<% @page_title = 'Add Film' %>
<div class='container'>
<div class='row'>
<div class='col s-6'>
<div class="jumbotron jumbotron-fluid bg-info">
<div class="container">
<h1 class="display-4 text-center">ADD NEW FILM <i class="fas fa-plus"></i></h1>
<p class="lead">This is a modified jumbotron that occupies the entire horizontal space of its parent.</p>
</div>
</div>
</div>
<div class='col s-6'>
<%= form_for(:video, :url => {:action => 'create'}) do |f| %>
<%= render(:partial => 'form', :locals => {:f => f}) %>
<%= submit_tag('Add Film', :class => 'btn btn-primary float-right') %>
<% end %>
</div>
</div>
</div>
如果你愿意,我已经把我的项目放在 Github 上了。
我建议进行以下更改:
在_form.html.erb中将select的名字复数,即改成
<%= f.select(:category_id, @categories.map{|t| [t.name, t.id]}, {}, :multiple => true, :class => 'custom-select') %>
至
<%= f.select(:category_ids, @categories.map{|t| [t.name, t.id]}, {}, :multiple => true, :class => 'custom-select') %>
中videos_controller.rb改
def video_params params.require(:video).permit(:title, :url, :description, category_attributes: [:id]).merge(user_id: session[:user_id]) end
至
def video_params params[:video][:category_ids].reject!(&:blank?) unless params[:video][:category_ids].nil? params.require(:video).permit(:title, :url, :description, category_ids: []).merge(user_id: session[:user_id]) end
也在videos_controller.rb移除
@video.category_ids = [video_params]
把事情留给构造函数
关于 2。我不是 100% 确定确切的解决方案,也许你也应该拒绝参数中的空 ID(根据提供的屏幕截图,为此使用 .reject!(&:blank?)
)- 对于分析进一步的问题,在将 video_params
函数的输出传递给构造函数之前检查它的输出 - 它基本上应该看起来像预期对象的哈希表示。
edit 更新了关于 category_ids
的 2 的更改建议