You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails报错:Entry对象不存在`string`方法及关联模型代码求助

解决Rails中undefined method 'string' for #<Entry:0x...>的报错

看起来你遇到的问题大概率和模型关联、表单构建或者强参数配置有关,咱们一步步来排查解决:

1. 先修正Admin控制器的new方法

你的new方法里只初始化了@b = B.new,但因为B属于A,表单需要关联到具体的A实例才能生成正确的嵌套路由。修改成这样:

class Admin::BsController < ApplicationController
  def create
    @a = A.find(params[:a_id])
    @b = @a.bs.create(entry_params)
    redirect_to a_path(@a)
  end

  def new
    @a = A.find(params[:a_id]) # 先找到对应的A实例
    @b = @a.bs.new # 通过A的关联来初始化B,而不是直接B.new
  end

  private
  # 别忘了补充强参数的定义,这里很关键!
  def entry_params
    # 注意:如果你的实际模型是Entry(报错里提到的),这里要改成:entry而不是:b
    params.require(:b).permit(:字段1, :字段2) # 替换成B模型的实际属性
  end
end

2. 修正视图中的form_with调用

因为是嵌套在Admin命名空间下的关联资源,表单需要同时传入命名空间、A实例和B实例:

<%= form_with(model: [:admin, @a, @b], local: true) do |form| %>
  <!-- 在这里添加你的表单字段,比如: -->
  <%= form.label :某个字段 %>
  <%= form.text_field :某个字段 %>

  <%= form.submit "创建" %>
<% end %>

3. 检查路由配置是否正确

确保你的routes.rb里正确定义了Admin命名空间下的嵌套资源:

# config/routes.rb
namespace :admin do
  resources :as do # A模型的复数是as,对应你的Model A
    resources :bs # B模型的复数是bs
  end
end

4. 排查报错里的Entry模型

报错提到的Entry应该就是你说的Model B吧?如果实际模型名是Entry,那你需要把代码里的B、b、bs全部替换成Entry、entry、entries,包括强参数里的params.require(:b)要改成params.require(:entry),表单里的字段也要对应调整。

为什么会出现这个报错?

大概率是因为:

  • 表单没有关联到正确的A实例,导致参数传递异常
  • 强参数配置错误(比如参数名和模型名不匹配,或者漏了必要的属性)
  • 模型初始化时传入了不存在的属性(比如某个字段被误写为string,而你的模型里没有这个属性)

按照上面的步骤调整后,应该就能解决这个问题了!

内容的提问来源于stack exchange,提问作者amarradi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:27:17