【问题标题】:Couldn't find 'Model' with 'id'=找不到带有 'id'= 的 'Model'
【发布时间】:2017-07-13 01:00:14
【问题描述】:

我不太明白为什么这不起作用。不知何故,我的服务 ID 根本没有通过。我想我对 ID 感到困惑,但这应该可以,但不能。当我点击提交时,它告诉我:找不到带有 'id'= 的服务

这是我的代码:

enquires_controller.rb

class EnquiresController < ApplicationController
  before_action :set_enquire, only: [:create, :new]

  def new
    @enquire = Enquire.new
  end

  def create
    @enquire = Enquire.new(enquire_params)
    @enquire.service = @service
    if user_signed_in?
      @user = current_user
    end
    if @enquire.save
      flash[:thanks] = "Thank you"
      redirect_to service_path(@service)
    else
      render :new
    end
  end

  private

  def set_enquire
    @service = Service.find(params[:service_id])
  end

  def enquire_params
    params.require(:enquire).permit(:first_name, :last_name, :company, 
                                    :message, :email, :phone_number, 
                                    :service_id )
  end

查询.rb

class Enquire < ApplicationRecord
  belongs_to :service
  validates :first_name, presence: true
  validates :last_name, presence: true
  validates :company, presence: true
  validates :message, presence: true
  validates :email, presence: true
  validates :service_id, presence: true
end

使用 @service 的服务视图
show.html.erb

<%= link_to 'Enquire about this Service', new_enquire_path(@service), 
class: "btn btn-primary enquire-btn text-middle" %>

服务.rb

has_many :enquires, :dependent => :destroy

routes.rb

resources :services do
  resources :enquires, only: [ :new, :create ]
end

resources :enquires, only: [ :new, :create, :index, :show, :destroy ]

最后查询表格 _form.html.erb

<%= simple_form_for(@enquire) do |f| %>
  <% if user_signed_in? %>
    <div class="form-inputs" id="session-form">
      <%= f.input :first_name, as: "hidden", input_html: { value: @user.first_name } %>
      <%= f.input :last_name, as: "hidden", input_html: { value: @user.last_name } %>
      <%= f.input :email, as: "hidden", input_html: { value: @user.email } %>
      <%= f.input :company, as: "hidden", input_html: { value: @user.company_name } %>
      <%= f.input :phone_number, autofocus: true, placeholder: "Phone Number", label:false %>
      <%= f.input :message, autofocus: true, :input_html => { id: "no-resize" }, placeholder: "Message", label:false %>
    </div>
  <% else %>
    <div class="form-inputs" id="session-form">
      <%= f.input :first_name, required: true, autofocus: true, placeholder: "First Name", label:false %>
      <%= f.input :last_name, required: true, autofocus: true, placeholder: "Last Name", label:false %>
      <%= f.input :email, required: true, autofocus: true, placeholder: "Email", label:false %>
      <%= f.input :company, required: true, autofocus: true, placeholder: "Company", label:false %>
      <%= f.input :phone_number, autofocus: true, placeholder: "Phone Number", label:false %>
      <%= f.input :message, autofocus: true, :input_html => { id: "no-resize" }, placeholder: "Message", label:false %>
    </div>
  <% end %>

  <div class="row">
    <div class="col-xs-12">
      <div class="form-actions text-center">
        <%= f.button :submit, "Submit Enquiry", class: "gen-create-btn" %>
      </div>
    </div>
  </div>
<% end %>

点击提交时我得到的参数是:

"✓", "authenticity_token"=>"xcqR44gPOI7gsN47ddnqKxKuTcaB1Pi5goLa5H81oecbDD7nxE/A1J4KR7rY0Dbyndgz6BrFKzukkTbOCjoGMg==", "enquire"=>{"first_name"=>"daadadad", "last_name"=>"adadada," dadad", "company"=>"adada", "phone_number"=>"dadad", "message"=>"adada"}, "commit"=>"提交查询", "controller"=>"enquires", "action"=>"create"} 允许:false>

编辑:

也许服务显示方法与它有关?
services_controller.rb

def show
  @service = Service.find(params[:id])
  @user = current_user  
end

【问题讨论】:

  • 试试findparams[:id]@service = Service.find(params[:id]),你会得到什么?
  • 仍然是相同的错误消息,它以某种方式根本无法通过 id。服务 ID 不在参数中,这就是我如此困惑的原因
  • 你的 show 方法是什么?
  • 我没有此型号的查询显示方法。并且该服务的 show 方法也与查询无关,因为只有一个链接应该将我当前正在查看的服务的 id 传递给查询表单
  • 最后但并非最不重要的一点是,在路由中有一组resources。拥有多个资源会导致混乱:)

标签: ruby-on-rails


【解决方案1】:

您有 before_action :set_enquire, only: [:create, :new],它将被 newcreate 方法调用。

def set_enquire
  @service = Service.find(params[:service_id])
end

当你查看create方法中的params时,没有service_id,所以params[service_id]nil。所以它失败了Couldn't find Service with 'id'=

解决方案:

删除before_action for create 方法

before_action :set_enquire, only: [:new]

并且由于@servicenew 方法中可用,将service_id 作为hidden_field 发送表单中的hidden_field

<%= f.hidden_filed :service_id, @service %>

并在create 方法中,添加以下行

@service = Service.find(params[:enquire][:service_id])

或者

除了resources :enquires,我看到你还有servicesenquires嵌套资源,所以你可以像下面这样使用它们

<%= simple_form_for [@service, @enquire] do |f| %>

注意:

请将set_enquire 更改为set_service,因为您定义的是service 而不是enquiry

更新:

你也应该改变

<%= link_to 'Enquire about this Service', new_enquire_path(@service), 
class: "btn btn-primary enquire-btn text-middle" %>

<%= link_to 'Enquire about this Service', new_service_enquire_path(@service), 
class: "btn btn-primary enquire-btn text-middle" %>

所以params 正确传递。

【讨论】:

  • 所以我尝试将它放入服务 show.html.erb 以及 _form 文件中,但不知何故此错误消息不会改变。它表明 @service = Service.find(params[:service_id]) 有问题
  • 所以。我做了你写的,两种方法,但它根本无法加载表格。总是说找不到id。所以问题只是 before_action 方法中的 @service = Service.find(params[:service_id]) 行。也许要补充一下,现在我的网址说:localhost:3000/enquires/new.30。那个点是怎么回事?
  • @WenqingKevinMa 你也应该把这个&lt;%= link_to 'Enquire about this Service', new_enquire_path(@service), class: "btn btn-primary enquire-btn text-middle" %&gt;改成&lt;%= link_to 'Enquire about this Service', new_service_enquire_path(@service), class: "btn btn-primary enquire-btn text-middle" %&gt;
  • 好的,我从 from 中删除了 因为它在重新加载表单页面时给了我一个错误,说参数太多。现在我的网址更改为localhost:3000/services/30/enquires/new,我可以看到很好的表格。但是当我点击提交时,它给了我: undefined method `[]' for nil:NilClass for line: @service = Service.find(params[:enquiry][:service_id])
  • @WenqingKevinMa 不要在表单中删除它。试试这个&lt;%= f.hidden_filed :service_id, @service %&gt; 而不是那个
【解决方案2】:

我认为您的问题来自您的 routes.rb 中查询资源的两条路由,如果您的对象来自第二个资源 :enquires 它将产生错误,因为它找不到作为服务的“父”路由。

resources :services do
  resources :enquires, only: [ :new, :create ]
end

resources :enquires, only: [ :new, :create, :index, :show, :destroy ]

【讨论】:

  • 所以我将其更改为资源:服务做资源:查询,仅:[:新,:创建]结束资源:查询,仅:[:索引,:显示,:销毁]这是有道理的.如果我使用 pavan 给我的答案,我会收到错误消息:No route matches [POST] "/enquires"
猜你喜欢
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 2015-08-28
相关资源
最近更新 更多