我已经创建了 my_portfolio.html.erb ,并将表单提交给带有远程控制器的控制器: true ,控制器接受参数并验证一切都可以正常使用条件和代码,但不能渲染部分 js 错误说 StocksController#search 中的 ActionController::UnknownFormat ActionController::未知格式 提取的源代码(第 7 行附近):
@stock = Stock.new_lookup(params[:stock])
if @stock
respond_to do |format|
format.js { render partial: 'users/result', status: :unprocessable_entity }
end
<h1>My portfolio</h1>
<div class="search-area">
<p>search stock</p>
<%= form_tag search_stock_path, remote: true, method: :get do %>
<!-- form fields go here -->
<div class="form-group row">
<div class="col-sm-9 no-right-padding">
<%= text_field_tag :stock, params[:stock], placeholder: "stock ticker symbol", autofocus: true, class: "form-control form-control-lg" %>
</div>
<div class="col-sm-3 no-left-padding">
<%= button_tag type: :submit, class: "btn btn-success" do %>
<%= fa_icon 'search' %>
<% end %>
</div>
</div>
<% end %>
</div>
<div id="results">
</div>
app/views/users/my_portfolio.html.erb
StocksController 类 < ApplicationController
def search
if params[:stock].present?
@stock = Stock.new_lookup(params[:stock])
if @stock
respond_to do |format|
format.js { render partial: 'users/result', status: :unprocessable_entity }
end
else
flash[:alert] = "Please enter a valid symbol"
redirect_to my_portfolio_path
end
else
flash[:alert] = "Please enter a symbol to search"
redirect_to my_portfolio_path
end
end
end
app/controllers/stocks_controller.rb
alert("heelo word")
_result.js.erb
这里问题的核心很可能是您正在遵循过时的教程。
渲染 JavaScript 实际上并不是您在 Rails 7 中所做的事情。这就是您如何在使用 Rails Unobtrusive Javascript (Rails UJS) 的旧应用程序之上撒上一点 Ajax 的方式。这并不是很好,因为它实际上包括一遍又一遍地编写相同的蹩脚 JS,以用服务器上呈现的转义 HTML 内容替换某些元素。它完全缺乏任何合理的架构,而且一团糟。
Rails 7 用 Turbo 取代了 Rails UJS 和 Turbolinks,Turbo 一切都做得更好。使用 Turbo,您可以使用
format.turbo
渲染部分内容并将 MIME 类型设置为 text/vnd.turbo-stream.html
。这只是 HTML 块,Turbo 将处理前端内容的替换。如果您需要做一些超出简单流或帧之外的事情,您可以编写刺激控制器。