Ruby on rails 不能';找不到';型号';与';id'=
我不太明白这为什么不起作用。不知何故,我的服务ID根本无法通过。我想我被身份证弄糊涂了,但这应该行得通,但实际上不行。当我点击submit时,它告诉我:找不到id为的服务= 这是我的密码: 查询(u controller.rb)Ruby on rails 不能';找不到';型号';与';id'=,ruby-on-rails,Ruby On Rails,我不太明白这为什么不起作用。不知何故,我的服务ID根本无法通过。我想我被身份证弄糊涂了,但这应该行得通,但实际上不行。当我点击submit时,它告诉我:找不到id为的服务= 这是我的密码: 查询(u controller.rb) class EnquiresController < ApplicationController before_action :set_enquire, only: [:create, :new] def new @enquire = Enqui
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
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 %>
您在操作:set\u inquire之前有
,只有:[:create,:new]
,它将在new
和create
方法上被调用
def set_enquire
@service = Service.find(params[:service_id])
end
当您查看create
方法中的params
时,没有service\u id
,因此params[service\u id]
是nil
。所以它失败了,因为找不到id为的服务=
解决方案:
删除create
方法的before_操作
before_action :set_enquire, only: [:new]
由于@service
可用在新建
方法中,将服务id作为隐藏字段
从表单中发送
<%= f.hidden_filed :service_id, @service %>
或
除了资源:查询
,我可以看到您还有嵌套资源,用于服务
和查询
,因此您可以使用如下表单中的资源
<%= simple_form_for [@service, @enquire] do |f| %>
到
因此,params
被正确传递。我认为您的问题来自路由中查询资源的两个路由。rb如果您的对象来自第二个资源:查询,它将生成一个错误,因为它找不到作为服务的“父”路由
resources :services do
resources :enquires, only: [ :new, :create ]
end
resources :enquires, only: [ :new, :create, :index, :show, :destroy ]
尝试使用params[:id]
:@service=service.find(params[:id])
来查找find,您会得到什么?仍然是相同的错误消息,不知何故根本无法通过id。服务id不在参数中,这就是为什么我如此困惑您的show
方法是什么?我没有此型号的查询显示方法。服务的显示方法与查询无关,因为只有一个链接应该将我当前查看的服务id传递到查询表单,最后但并非最不重要的是,在路由中有一组资源。有多个相同的资源将导致混淆:)因此我尝试将其放入服务show.html.erb以及_表单文件中,但不知何故,此错误消息不会改变。它表示@service=service.find(params[:service_id])有问题。我做了您所写的,使用两种方法,但它根本无法加载表单。总是说找不到id。所以问题只是before_操作方法中的@service=service.find(params[:service_id])行。也许要添加,现在我的url显示:。那个圆点怎么了?@WenqingKevinMa你也应该把这个
改成
好的,我从中删除了,因为它给我一个错误,在重新加载表单页面时说太多参数。现在我的网址改为,我可以看到的形式,这是好的。但当我点击submit时,它给出了nil:NilClass的未定义方法“[]”,行:@service=service.find(params[:enquiry][:service\u id])@WenqingKevinMa不要在表单中删除它。试着用这个
代替它,所以我把它改成了resources:services do resources:inquires,only:[:new,:create]end resources:inquires,only:[:index,:show,:destroy],这很有意义。如果我使用pavan给我的答案,我会得到错误:没有路线匹配[POST]“/查询”
before_action :set_enquire, only: [:new]
<%= f.hidden_filed :service_id, @service %>
@service = Service.find(params[:enquire][:service_id])
<%= simple_form_for [@service, @enquire] do |f| %>
<%= 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" %>
resources :services do
resources :enquires, only: [ :new, :create ]
end
resources :enquires, only: [ :new, :create, :index, :show, :destroy ]