【问题标题】:Render not working on second method in controller渲染无法在控制器中使用第二种方法
【发布时间】:2017-07-12 19:56:54
【问题描述】:

我正在实现一个电话和 sim 检查器,该检查器由用户首先输入电话号码组成。如果输入的电话号码在数据库中,则此表单将消失,并出现第二个表单以检查用户的 sim 号码是否在数据库中。 我目前遇到的问题是第一种方法(def phonechecker)可以很好地渲染 phone-found.js.erb、phone-not-found.js.erb 和 error.js.erb。但我收到一个模板错误:

Missing template phones/phone-not-found, application/phone-not-found with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :axlsx, :haml]}.

在运行 simchecker 方法时,当我在汇总他们的 sim_number 后尝试再次渲染相同的模板时,会出现此错误。

代码如下:

app/controllers/phones_controller.rb

class PhonesController < ApplicationController
  protect_from_forgery with: :null_session
  def checkphone
    @phone_number = Phone.where('phone_number = ?', params[:phone][:phone_number])
    if @phone_number.exists?
      render 'phone-found'

    elsif @phone_number.blank?
      render 'phone-not-found'

    else
      render 'errors'
    end
  end

  def checksim
    @sim_number = Phone.where('sim_number = ?', params[:sim][:sim_number])
    if @sim_number.exists?
      render 'phone-found'

    elsif @sim_number.blank?
      render 'phone-not-found'

    else
      render 'errors'
    end
  end

  private

  def phone_params
    params.require(:phone).permit(
      :phone_number
    )
  end

  def sim_params
    params.require(:sim).permit(
      :sim_number
    )
  end
end

app/views/phones/phone-found.js.erb

$('#phone-number-found').append("<%= j render(partial: 'sim') %>")
$('#phone-number-not-found').html('');
$('#phone-number-error').html('');
$('#phone_phone_number').hide();

app/views/phones/phone-not-found.js.erb

$('#phone-number-found').html('');
$('#phone-number-not-found').html('Working!');
$('#phone-number-error').html('');

app/views/phones/error.js.erb

$('#phone-number-found').html('');
$('#phone-number-not-found').html('');
$('#phone-number-error').html('Working!');

app/views/phones/_sim.html.erb

<%= form_for :sim, :url => url_for(:action => 'checksim', :controller => 'phones'), remote: true, :authenticity_token => false, html: { id: 'sim-number-form'}  do |f| %>
  <div id="phone-number-found"></div>
  <div id="phone-number-not-found"></div>
  <div id="phone-number-error"></div>
  <%= f.text_field :sim_number %>
  <%= submit_tag("Check") %>
<% end %>

app/views/phones/index.html.erb

<%= form_for :phone, :url => url_for(:action => 'checkphone', :controller => 'phones'), remote: true, :authenticity_token => false, html: { id: 'phone-number-form'}  do |f| %>
  <div id="phone-number-found"></div>
  <div id="phone-number-not-found"></div>
  <div id="phone-number-error"></div>
  <%= f.text_field :phone_number %>
  <%= submit_tag("Check") %>
<% end %>

config/routes.rb

post "/checkphone" => "phones#checkphone"
  post "/checksim" => "phones#checksim"

  resources :phones, path: '4g-promo'

如果有人能解决我的问题,将不胜感激。谢谢!

【问题讨论】:

  • 找不到模板通常是因为找不到模板:try => 渲染模板:“phones/phone-not-found”,或者将文件名中的“-”替换为“_”,或将其设为部分开头:'_your_file.erb'
  • 顺便说一句,与您的问题没有直接关系:您应该使用Phone.where(phone_number: x) 而不是.where('phone_number = ?', x)。与您的 sim_number 列相同。如果你想要一个直接相等的where 条件,只需给 ActiveRecord 一个哈希值。

标签: javascript html ruby-on-rails ajax erb


【解决方案1】:

在错误中,您可以看到它正在寻找 html :formats=&gt;[:html] 或其中一种变体::erb, :builder, :raw, :ruby, :coffee, :axlsx, :haml。但是您希望它查找.js.erb。您需要在控制器方法中添加一个 respond_to 方法,例如:

def checksim
  @sim_number = Phone.where('sim_number = ?', params[:sim][:sim_number])

  respond_to do |format|
    if @sim_number.exists?
      format.js {render 'phone-found'}
    elsif @sim_number.blank?
      format.js {render 'phone-not-found'}
    else
      format.js {render 'errors'}
    end
  end
end

【讨论】:

  • 您好,感谢您的回答!不幸的是,这不起作用,不知道我是否做得对,但这就是我在我的方法中尝试的方法:ef checksim respond_to do |format| format.js {} end @sim_number = Phone.where('sim_number = ?', params[:sim][:sim_number]) if @sim_number.exists? render 'phone-found' elsif @sim_number.blank? render 'phone-not-found' else render 'errors' end end 我得到的错误是 ActionController::UnkownFormat
  • 我更新了这个例子来展示你应该怎么做
  • 另外这里是 Rails 文档部分的链接,其中显示了示例 guides.rubyonrails.org/…
  • 谢谢!不幸的是得到了同样的错误: ActionController::UnkownFormat on respond_to do |format| ://
  • 也许可以确保remote: true 在您的表单上正常工作?您能否验证提交表单时是否发出 AJAX 请求?
猜你喜欢
  • 2011-04-28
  • 2017-10-09
  • 1970-01-01
  • 2023-03-22
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
相关资源
最近更新 更多