ruby-on-rails - Simple_form 和 Accepts_nested_attributes_for 的问题
问题描述
我对 RoR 很陌生,如果我说的不正确,我很抱歉。
我有这些模型。
class Course < ApplicationRecord
has_many :frequencies, inverse_of: :course
belongs_to :subject, optional: true
validates :start_date, presence: true
end
class Frequency < ApplicationRecord
belongs_to :user
belongs_to :course
validates :course, presence: true
validates_presence_of :course
accepts_nested_attributes_for :user, :course
has_many_attached :docs
end
课程和频率之间的关系是 1:N,但最后,我将其用作 1:1(定义模型后情况发生了变化)。
这是视图app/views/frequencies/show.html.haml
= simple_form_for @frequency, :url => frequencies_update_path(:id => @frequency.id) do |f|
.panel.panel-primary
.panel-heading
%h4.panel-title= t 'frequencies.upd_frequency'
.panel-body
= f.simple_fields_for :user do |u|
.row
.col-md-4
= u.label t 'frequencies.first_name'
.col-md-4
= u.input :first_name, :label => false, :disabled => true, :input_html => {:id => 'first_name'}
.row
.col-md-4
= u.label t 'frequencies.last_name'
.col-md-4
= u.input :last_name, :label => false, :disabled => true, :input_html => {:id => 'last_name'}
-#= u.hidden_field :id, value: @user_id
.panel.panel-primary
.panel-heading
%h4.panel-title= t 'frequencies.course'
.panel-body
= f.simple_fields_for :course do |u|
.row
.col-md-4
= u.label t 'frequencies.course_start_date'
.col-md-4
= u.input :start_date, :label => false, :disabled => (@frequency.validated? ? true : false), :input_html => {:id => 'course_start_date'}
.
.
.
= f.submit t('button.save'), :class => 'btn btn-primary ' + (current_user.role == $admin_role && @frequency.validated? ? 'disabled' : '')
= link_to t('button.cancel'), request.referer.present? ? request.referer : frequencies_index_path, :class => 'btn btn-default'
这是频率控制器.rb的一部分
def update
@frequency = Frequency.find params[:id]
@course = Course.find @frequency.course_id
if over_max_hours_in_a_day(frequency_params[:user_attributes][:id], @course)
flash[:danger] = t('flash.max_hours')
render :action => :show and return
end
if @course.update(frequency_params[:course_attributes])
@frequency.docs.attach(frequency_params[:attach][:docs]) if (frequency_params[:attach].present? && frequency_params[:attach][:docs].present?)
flash[:notice] = t('flash.upd')
redirect_to :action => 'index' and return
else
flash[:danger] = @course.errors.full_messages.to_sentence
render :action => :show and return
end
end
def show
@frequency = Frequency.find params[:id]
@subjects = Subject.all
end
我可以从相关频率的角度编辑课程,但我有一些奇怪的行为:
- 当我保存验证过程时,我的错误消息仅作为 Flash 消息,而不是在所涉及的字段下(在其他更简单的视图中,我在字段下也有消息)
- 当我编辑某些课程的字段(从频率视图)并单击保存按钮后,它会调用更新操作,但是,如果它在 over_max_hours_in_a_day if 条件内运行,我无法在修改后的视图上保持相同预编译的字段(但我有像它在开始显示动作时加载的字段)
- 当我在上一次编辑失败后按下取消按钮时,我会留在同一页面上,而不是返回上一个视图(索引视图)
我不确定这是否是由于belongs_to 模型上的accepts_nested_attributes_for,因为我通常在has_many 模型中看到它。
导轨 5 5.2.2
simple_form 4.1.0
拜托,你能帮帮我吗?
谢谢。
解决方案
- 根据视图(来自显示/索引页面)单独的逻辑。创建 2 个更新方法
- 如果出现错误,只需再次渲染视图
render :show OR render :index
- 我认为最好将 over_max_hours_in_a_day 的逻辑移动到模型中
- 对于取消按钮,不要使用引荐来源网址,因为更新后它将不起作用。使用表单本地人或其他方式传递确切的返回 url
- 如果你想高亮字段 - 你必须使用表单参数调用
.update
,.save
方法
推荐阅读
- javascript - onload 不能使用 'Vue-konva'
- symfony - 在 Symfony 中无法使用 encore dev-server 获取 /
- android - JW Player隐藏全屏按钮
- python-3.x - 如何关闭在 python 中使用 matplotlib 显示的图形?图像,图形和图片之间有什么区别?
- c# - 各种 SharedItems 属性的 excel 用途是什么?
- angular - 在 NgbModal 中将 ControlValueAccessor-Component 作为内容发送
- javascript - 弹性 - 进行增强查询 + 必须查询时,Desc 排序不再起作用
- r - 从数据集/变量中删除自定义(第二个)类
- python - 如何使用beautifulsoup从url中的表中返回多个页面的数据
- c# - 统一收到此错误(2018.4.6)错误CS0103:当前上下文中不存在名称'linkApp'