草庐IT

【自动驾驶】二自由度车辆动力学模型

CHH3213 2023-05-28 原文

文章目录

参考资料

  1. 车辆数学模型
  2. 车辆模型-动力学模型(Dynamics Model)

1. 基本模型建立

我们作如下假设:

  • 车辆所受的空气的力只会对车身坐标系x轴方向上的运动有影响,y轴方向和沿着z轴的旋转不会受到空气力的影响;
  • 车辆运行在二维平面中,也就是z轴无速度。
  • 车辆轮胎力运行在线性区间。

运动学模型中,我们假设了单车模型中前后轮的速度矢量与轮子方向一致。当车辆速度很高时,单车模型中前后轮的速度矢量不再与轮子方向一致。此时运动学模型就不能准确地描述车辆的运动状态,这就需要使用动力学模型对车辆进行建模。

车辆单车模型中需要考虑两个维度的信息,这两个维度分别指代表车辆横向位置信息的 y y y和表示车辆偏航角信息的 ψ \psi ψ。他们可以大致分为两类: 纵向力(Longitudinal force) 和 横向力(Lateral force), 纵向力就是使车辆前后移动的力量,而横向力则促使车辆在横向移动,在力的相互作用过程中,轮胎起着决定性的作用(根据一定的物理常识,轮胎是车辆运动的一个重要的力的来源)。

之所以叫二自由度的车辆动力学模型,就是因为二自由度指的是横向上y轴的运动和绕z轴的转动,忽略了纵向x轴的运动。

建立如下坐标系,X,Y表示全局坐标系,x,y则表示车身坐标系,x轴方向沿车辆中轴方向向前,y轴方向朝右,其车辆中心在质心位置。车辆的状态信息表示为 ( x , y , ψ , v ) (x,y,\psi,v) (x,y,ψ,v),即 x , y x,y x,y方向上的位置,偏航角和速度。

平动

首先假设车辆为一个质点,对该质点进行受力分析,并根据牛顿第二定律得
m a y = F y f + F y r m a x = F x f + F x r − F a e r o (1) \tag{1} m a_{y}=F_{y f}+F_{y r}\\ ma_x=F_{xf}+F_{xr}-F_{aero} may=Fyf+Fyrmax=Fxf+FxrFaero(1)
其中,

  • a y a_{y} ay 为车辆重心处 y y y 轴方向的惯性加速度,满足 a y = d 2 y d t 2 a_y=\frac{d^2y}{dt^2} ay=dt2d2y

  • F y f F_{y f} Fyf F y r F_{y r} Fyr ​分别表示车前轮和后轮所受到的力在y轴方向上的分量。

  • F x f F_{x f} Fxf F x r F_{x r} Fxr分别表示车前轮和后轮所受到的力在x轴方向上的分量。

  • F a e r o F_{aero} Faero​表示车在x轴方向受到的空气阻力。

平动过程中,有两 种力共同作用产生加速度 a y a_{y} ay : 车辆延 y y y 轴产生的惯性加速度 y ¨ \ddot{y} y¨ 和车辆绕旋转中心 O O O 旋转产生的向心加速度 a c = v x 2 R = v x ψ ˙ ∘ a_{c}=\frac{{v_x}^2}{R}=v_{x} \dot{\psi}_{\circ} ac=Rvx2=vxψ˙
a y = y ¨ + v x ψ ˙ (2) \tag{2} a_{y}=\ddot{y}+v_{x} \dot{\psi} ay=y¨+vxψ˙(2)
将公式(2)带入公式(1)得
m ( y ¨ + v x ψ ˙ ) = F y f + F y r (3) \tag{3} m\left(\ddot{y}+v_{x} \dot{\psi}\right)=F_{y f}+F_{y r} m(y¨+vxψ˙)=Fyf+Fyr(3)

同理,沿着x轴有
a x = v ˙ x − v y ψ ˙ m ( v ˙ x − v y ψ ˙ ) = F x f + F x r − F a e r o (3-2) \tag{3-2} a_x=\dot{v}_x-v_y\dot{\psi}\\ m(\dot{v}_x-v_y\dot{\psi})=F_{xf}+F_{xr}-F_{aero} ax=v˙xvyψ˙m(v˙xvyψ˙)=Fxf+FxrFaero(3-2)

其中,
v x ˙ = x ¨ v y ˙ = y ¨ \dot{v_x}=\ddot{x}\\ \dot{v_y}=\ddot{y} vx˙=x¨vy˙=y¨

转动

假设车辆为刚体,刚体绕重心转动,该运动过程使用力矩和转动惯量进行描述。 车辆绕Z轴旋转产生的力矩平衡,对应的偏航动力学方程为
I z ψ ¨ = l f F y f − l r F y r (4) \tag{4} I_{z} \ddot{\psi}=l_{f} F_{y f}-l_{r} F_{y r} Izψ¨=lfFyflrFyr(4)
其中, l f l_{f} lf l r l_{r} lr 代表前后轮胎到重心的距离。

2. 横向(y方向)受力计算

车辆轮胎在y轴方向受到的力 F y f F_{yf} Fyf​、 F y r F_{yr} Fyr​实验结果表明,其大小正比于轮胎的侧滑角。其侧滑角如下图所示:

根据上图,前轮侧滑角为

α f = δ − θ v f (5) \tag{5} \alpha_{f}=\delta-\theta_{v f} αf=δθvf(5)
其中, θ v f \theta_{v f} θvf 代表速度矢量与车辆纵轴的夹角, δ \delta δ 代表前轮转向角。

同理,由于后轮转向角 δ \delta δ 为 0 ,故后轮侧滑角为
α r = − θ v r (6) \tag{6} \alpha_{r}=-\theta_{vr} αr=θvr(6)
车辆前轮的横向力可以表示为
F y f = 2 C α f ( δ − θ v f ) (7) \tag{7} F_{y f}=2 C_{\alpha f}\left(\delta-\theta_{v f}\right) Fyf=2Cαf(δθvf)(7)
其中,比例常数 C α f C_{\alpha f} Cαf 代表每个前轮的转弯刚度(cornering stiffness)。

同理后轮的横向力可以写为
F y r = 2 C α r ( − θ v r ) (8) \tag{8} F_{y r}=2 C_{\alpha r}\left(-\theta_{v r}\right) Fyr=2Cαr(θvr)(8)
其中,比例常数 C α r C_{\alpha r} Cαr 代表每个后轮的转弯刚度(cornering stiffness)。

3. 横向动力学模型推导

点 C 代表车辆的重心, A 点和 B点到重心的距离分别用 l f l_f lf​和 l r l_r lr​​表示,轴距表示为 L = l f + l r L = l_f + l_r L=lf+lr​。

车辆平动产生的速度分量 v x v_{x} vx v y v_{y} vy ,以及绕点 C C C 转动产生的线速度 l f ψ ˙ l_{f} \dot{\psi} lfψ˙ l r ψ ˙ l_{r} \dot{\psi} lrψ˙ (根据角速度与线速度的关系 ω = v R \omega=\frac{v}{R} ω=Rv得到)组成。根据上图得
tan ⁡ ( θ v f ) = v y + l f ψ ˙ v x (9) \tag{9} \tan \left(\theta_{v f}\right)=\frac{v_{y}+l_{f} \dot{\psi}}{v_{x}} tan(θvf)=vxvy+lfψ˙(9)
tan ⁡ ( θ v r ) = v y − l r ψ ˙ v x (10) \tag{10} \tan \left(\theta_{v r}\right)=\frac{v_{y}-l_{r} \dot{\psi}}{v_{x}} tan(θvr)=vxvylrψ˙(10)
由于通常情况下速度矢量的夹角很小,可以使用小角度近似原理
tan ⁡ ( δ ) ≈ δ \tan \left(\delta\right) \approx \delta tan(δ)δ

θ v f = y ˙ + l f ψ ˙ v x (11) \tag{11} \theta_{v f}=\frac{\dot{y}+l_{f} \dot{\psi}}{v_{x}} θvf=vxy˙+lfψ˙(11)
θ v r = y ˙ − l r ψ ˙ v x (12) \tag{12} \theta_{v r}=\frac{\dot{y}-l_{r} \dot{\psi}}{v_{x}} θvr=vxy˙lrψ˙(12)

将等式(7)、(8)、(11)和(12)代入等式(3)中得
m ( y ¨ + v x ψ ˙ ) = 2 C α f ( δ − y ˙ + l f ψ ˙ v x ) + 2 C α r ( − y ˙ − l r ψ ˙ v x ) (13) \tag{13} m\left(\ddot{y}+v_{x} \dot{\psi}\right)=2 C_{\alpha f}\left(\delta-\frac{\dot{y}+l_{f} \dot{\psi}}{v_{x}}\right)+2 C_{\alpha r}\left(-\frac{\dot{y}-l_{r} \dot{\psi}}{v_{x}}\right) m(y¨+vxψ˙)=2Cαf(δvxy˙+lfψ˙)+2Cαr(vxy˙lrψ˙)(13)
等式(13)左右两边同时除以 m m m ,分别提取 y ¨ 、 y ˙ 、 ψ ˙ \ddot{y} 、 \dot{y} 、 \dot{\psi} y¨y˙ψ˙ δ \delta δ 项得
y ¨ = − 2 C α f + 2 C α r m v x y ˙ − ( v x + 2 C α f l f − 2 C α r l r m v x ) ψ ˙ + 2 C α f m δ (14) \tag{14} \ddot{y}=-\frac{2 C_{\alpha f}+2 C_{\alpha r}}{m v_{x}} \dot{y}-\left(v_{x}+\frac{2 C_{\alpha f} l_{f}-2 C_{\alpha r} l_{r}}{m v_{x}}\right) \dot{\psi}+\frac{2 C_{\alpha f}}{m} \delta y¨=mvx2Cαf+2Cαry˙(vx+mvx2Cαflf2Cαrlr)ψ˙+m2Cαfδ(14)
转化为矩阵形式如下
y ¨ = [ 0 − 2 C α f + 2 C α r m V x 0 − ( v x + 2 C α f l f − 2 C α r l r m v x ) ] [ y y ˙ ψ ψ ˙ ] + 2 C α f m δ (15) \tag{15} \ddot{y}=\left[\begin{array}{llll} 0 & -\frac{2 C_{\alpha f}+2 C_{\alpha r}}{m V_{x}} & 0 & -\left(v_{x}+\frac{2 C_{\alpha f} l_{f}-2 C_{\alpha r} l_{r}}{m v_{x}}\right) \end{array}\right]\left[\begin{array}{l} y \\ \dot{y} \\ \psi \\ \dot{\psi} \end{array}\right]+\frac{2 C_{\alpha f}}{m} \delta y¨=[0mVx2Cαf+2Cαr0(vx+mvx2Cαflf2Cαrlr)] yy˙ψψ˙ +m2Cαfδ(15)
同理,将等式(7)、(8)、(11)和(12)代入等式(4)中得
I z ψ ¨ = 2 l f C α f ( δ − y ˙ + l f ψ ˙ v x ) − 2 l r C α r ( − y ˙ − l r ψ ˙ v x ) (16) \tag{16} I_{z} \ddot{\psi}=2 l_{f} C_{\alpha f}\left(\delta-\frac{\dot{y}+l_{f} \dot{\psi}}{v_{x}}\right)-2 l_{r} C_{\alpha r}\left(-\frac{\dot{y}-l_{r} \dot{\psi}}{v_{x}}\right) Izψ¨=2lfCαf(δvxy˙+lfψ˙)2lrCαr(vxy˙lrψ˙)(16)
等式(16)左右两边同时除以 I z I_{z} Iz ,分别提取 y ˙ 、 ψ ¨ 、 ψ ˙ \dot{y} 、 \ddot{\psi} 、 \dot{\psi} y˙ψ¨ψ˙ δ \delta δ 项得
ψ ¨ = − 2 l f C α f − 2 l r C α r I z v x y ˙ − 2 l f 2 C α f + 2 l r 2 C α r I z v x ψ ˙ + 2 l f C α f I z δ (17) \tag{17} \ddot{\psi}=-\frac{2 l_{f} C_{\alpha f}-2 l_{r} C_{\alpha r}}{I_{z} v_{x}} \dot{y}-\frac{2 l_{f}{ }^{2} C_{\alpha f}+2 l_{r}{ }^{2} C_{\alpha r}}{I_{z} v_{x}} \dot{\psi}+\frac{2 l_{f} C_{\alpha f}}{I_{z}} \delta ψ¨=Izvx2lfCαf2lrCαry˙Izvx2lf2Cαf+2lr2Cαrψ˙+Iz2lfCαfδ(17)
等效的矩阵形式为
ψ ¨ = [ 0 − 2 l f C α f − 2 l r C α r I z v x 0 − 2 l f 2 C α f + 2 l r 2 C α r I z v x ] [ y y ˙ ψ ψ ˙ ] + 2 l f C α f I z δ (18) \tag{18} \ddot{\psi}=\left[\begin{array}{llll} 0 & -\frac{2 l_{f} C_{\alpha f}-2 l_{r} C_{\alpha r}}{I_{z} v_{x}} & 0 & -\frac{2 l_{f}{ }^{2} C_{\alpha f}+2 l_{r}{ }^{2} C_{\alpha r}}{I_{z} v_{x}} \end{array}\right]\left[\begin{array}{l} y \\ \dot{y} \\ \psi \\ \dot{\psi} \end{array}\right]+\frac{2 l_{f} C_{\alpha f}}{I_{z}} \delta ψ¨=[0Izvx2lfCαf2lrCαr0Izvx2lf2Cαf+2lr2Cαr] yy˙ψψ˙ +Iz2lfCαfδ(18)

根据等式(15)和(18)得
[ y ˙ y ¨ ψ ˙ ψ ¨ ] = [ 0 1 0 0 0 − 2 C α f + 2 C α r m V x 0 − ( V x + 2 C α f l f − 2 C α r l r m V x ) 0 0 0 1 0 − 2 l f C α f − 2 l r C α r I z V x 0 − 2 l f 2 C α f + 2 l r 2 C α r I z V x ] [ y y ˙ ψ ψ ˙ ] + [ 0 2 C α f m 0 2 l f C α f I z ] δ (19) \tag{19} \begin{aligned} \left[\begin{array}{c} \dot{y} \\ \ddot{y} \\ \dot{\psi} \\ \ddot{\psi} \end{array}\right]=\left[\begin{array}{cccc} 0 & 1 & 0 & 0 \\ 0 & -\frac{2 C_{\alpha f}+2 C_{\alpha r}}{m V_{x}} & 0 & -\left(V_{x}+\frac{2 C_{\alpha f} l_{f}-2 C_{\alpha r} l_{r}}{m V_{x}}\right) \\ 0 & 0 & 0 & 1 \\ 0 & -\frac{2 l_{f} C_{\alpha f}-2 l_{r} C_{\alpha r}}{I_{z} V_{x}} & 0 & -\frac{2 l_{f}{ }^{2} C_{\alpha f}+2 l_{r}{ }^{2} C_{\alpha r}}{I_{z} V_{x}} \end{array}\right]\left[\begin{array}{c} y \\ \dot{y} \\ \psi \\ \dot{\psi} \end{array}\right] \\ +\left[\begin{array}{c} 0\\ \frac{2 C_{\alpha f}}{m} \\ 0 \\ \frac{2 l_{f} C_{\alpha f}}{I_{z}} \end{array}\right] \delta \end{aligned} y˙y¨ψ˙ψ¨ = 00001mVx2Cαf+2Cαr0IzVx2lfCαf2lrCαr00000(Vx+mVx2Cαflf2Cαrlr)1IzVx2lf2Cαf+2lr2Cαr yy˙ψψ˙ + 0m2Cαf0Iz2lfCαf δ(19)

注意:上述动力学方程的推导建立在车辆侧滑角很小的情况下,这时的轮胎作用力与侧滑角可以近似为线性关系。当侧滑角很大时,轮胎作用力与侧滑角就不再是线性关系。

补充——考虑路面坡度角

如果还额外考虑路面坡度角(road bank angles)的影响,则公式(1)应写为
m a y = F y f + F y r + F b a n k m a_{y}=F_{y f}+F_{y r}+F_{bank} may=Fyf+Fyr+Fbank

式中
F b a n k = m g sin ⁡ ϕ F_{bank} = mg\sin{\phi} Fbank=mgsinϕ
ϕ \phi ϕ为路面坡度角,如下图所示

转动过程不受坡度角影响,即公式(4)不变。因此,其它按部就班推导即可。

4. 纵向(x方向)受力计算

车辆在 x \mathrm{x} x 轴方向的力 F x f 、 F x r F_{x f} 、 F_{x r} FxfFxr 与轮胎的滑比 σ x \sigma_{x} σx 成正比。其定义为:
{ σ x = r e f f ω w − v x v x  ——刹车时  σ x = r e f f ω w − v x r e f f ω w  ——加速时  (20) \tag{20} \left\{\begin{array}{l} \sigma_{x}=\frac{r_{e f f} \omega_{w}-v_{x}}{v_{x}} \text { ——刹车时 } \\ \sigma_{x}=\frac{r_{e f f} \omega_{w}-v_{x}}{r_{e f f} \omega_{w}} \text { ——加速时 } \end{array}\right. {σx=vxreffωwvx ——刹车时 σx=reffωwreffωwvx ——加速时 (20)
因此有:
F x f = 2 C σ f σ x f (21) \tag{21} F_{x f}=2 C_{\sigma f} \sigma_{x f} Fxf=2Cσfσxf(21)
F x r = 2 C σ r σ x r (22) \tag{22} F_{x r}=2 C_{\sigma r} \sigma_{x r} Fxr=2Cσrσxr(22)
其中 C σ r C_{\sigma r} Cσr 为纵向的轮胎刚性参数(tire stiffness parameters)。

对于空气阻力 :
F aero  = 1 2 ρ C d A F ( v x + v wind  ) 2 (23) \tag{23} F_{\text {aero }}=\frac{1}{2} \rho C_{d} A_{F}\left(v_{x}+v_{\text {wind }}\right)^{2} Faero =21ρCdAF(vx+vwind )2(23)
另外在全局坐标系下:
{ X ˙ = v x cos ⁡ ( ψ ) − v y sin ⁡ ( ψ ) Y ˙ = v x sin ⁡ ( ψ ) + v y cos ⁡ ( ψ ) (24) \tag{24} \left\{\begin{array}{l} \dot{X}=v_{x} \cos (\psi)-v_{y} \sin (\psi) \\ \dot{Y}=v_{x} \sin (\psi)+v_{y} \cos (\psi) \end{array}\right. {X˙=vxcos(ψ)vysin(ψ)Y˙=vxsin(ψ)+vycos(ψ)(24)

联立等式(3-2),(21),(22),(23),得

v ˙ x = 2 C σ r σ x r + 2 C σ f σ x f − 1 2 ρ C d A F ( v x + v w i n d ) 2 m + v y ψ ˙ (25) \tag{25} \dot{v}_{x}=\frac{2 C_{\sigma r} \sigma_{x r}+2 C_{\sigma f} \sigma_{x f}-\frac{1}{2} \rho C_{d} A_{F}\left(v_{x}+v_{w i n d}\right)^{2}}{m}+v_{y} {\dot{\psi}} v˙x=m2Cσrσxr+2Cσfσxf21ρCdAF(vx+vwind)2+vyψ˙(25)

5. 动力学模型总结

联立等式(14),(17),(24),(25)得
{ X ˙ = v x cos ⁡ ( ψ ) − v y sin ⁡ ( ψ ) Y ˙ = v x sin ⁡ ( ψ ) + v y cos ⁡ ( ψ ) x ˙ = v x y ˙ = v y v ˙ x = 2 C σ r σ x r + 2 C σ f σ x f − 1 2 ρ C d A F ( v x + v w i n d ) 2 m + v y ψ ˙ v ˙ y = − 2 C α f + 2 C α r m v x y ˙ − ( v x + 2 C α f l f − 2 C α r l r m v x ) ψ ˙ + 2 C α f m δ ψ ¨ = − 2 l f C α f − 2 l r C α r I z v x y ˙ − 2 l f 2 C α f + 2 l r 2 C α r I z v x ψ ˙ + 2 l f C α f I z δ (26) \tag{26} \left\{\begin{array}{l} \dot{X}=v_{x} \cos (\psi)-v_{y} \sin (\psi) \\ \dot{Y}=v_{x} \sin (\psi)+v_{y} \cos (\psi)\\ \dot{x}=v_x\\ \dot{y}=v_y\\ \dot{v}_{x}=\frac{2 C_{\sigma r} \sigma_{x r}+2 C_{\sigma f} \sigma_{x f}-\frac{1}{2} \rho C_{d} A_{F}\left(v_{x}+v_{w i n d}\right)^{2}}{m}+v_{y} {\dot{\psi}}\\ \dot{v}_y=-\frac{2 C_{\alpha f}+2 C_{\alpha r}}{m v_{x}} \dot{y}-\left(v_{x}+\frac{2 C_{\alpha f} l_{f}-2 C_{\alpha r} l_{r}}{m v_{x}}\right) \dot{\psi}+\frac{2 C_{\alpha f}}{m} \delta\\ \ddot{\psi}=-\frac{2 l_{f} C_{\alpha f}-2 l_{r} C_{\alpha r}}{I_{z} v_{x}} \dot{y}-\frac{2 l_{f}{ }^{2} C_{\alpha f}+2 l_{r}{ }^{2} C_{\alpha r}}{I_{z} v_{x}} \dot{\psi}+\frac{2 l_{f} C_{\alpha f}}{I_{z}} \delta \end{array}\right. X˙=vxcos(ψ)vysin(ψ)Y˙=vxsin(ψ)+vycos(ψ)x˙=vxy˙=vyv˙x=m2Cσrσxr+2Cσfσxf21ρCdAF(vx+vwind)2+vyψ˙v˙y=mvx2Cαf+2Cαry˙(vx+mvx2Cαflf2Cαrlr)ψ˙+m2Cαfδψ¨=Izvx2lfCαf2lrCαry˙Izvx2lf2Cαf+2lr2Cαrψ˙+Iz2lfCαfδ(26)

有关【自动驾驶】二自由度车辆动力学模型的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  4. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  5. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  6. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  7. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

  8. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  9. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  10. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

随机推荐