Rails Ajax Jquery



我正在使用rails对一篇文章进行动态编辑。在每个条款上都可以添加段落。我想按照 railscast 的 136-jquery-ajax 修订教程将 Ajax 与 Jquery 一起使用。我为表单和新的.js.erb响应创建了模板,但不断收到相同的错误:

段落控制器#new 缺少此请求格式和变体的模板。 request.formats: ["text/html"] request.variant: []

这是从视图/文章/显示请求新表单的链接

<%= link_to 'New Paragraph', new_article_paragraph_path(@article), remote: true, class: 'uk-button uk-button-primary' %>

视图/段落/_form

<div class="article-form-container">
<%= form_with scope: :paragraph, url: article_paragraphs, remote: true do |f| %>
<%= f.text_field :title, class: 'uk-input', placeholder: 'Title of paragraph (optional, can be a subtitle of the article)' %>
<%= f.text_area :text, class: 'uk-textarea', placeholder: 'Content of paragraph' %>
<%= f.hidden_field :position, :value => 3 %>
<div class="submit-button">
<%= f.submit class: 'uk-button uk-button-primary' %>
</div>
<% end %>
</div>

路线

resources :articles, only: %i[show update destroy create]
resources :articles do
resources :paragraphs, only: %i[new create update destroy]
end

视图/段落/新建.js.erb

$('div#article-control-panel').hide("fast", function () {
$('div#article-control-panel').after('<%= j render 'form' %>')
})

控制器/paragraphs_controller

class ParagraphsController < ApplicationController
def new
@paragraph = Paragraph.new
end
def create
@paragraph = Paragraph.new(paragraph_params)
@article = Article.find(params[:article_id])
if @article.user == current_user
@paragraph.article = @article
@paragraph.save
end
respond_to do |format|
format.html { redirect_to @article }
format.js
end
end
def paragraph_params
params.require(:paragraph).permit(:title, :text, :position)
end
end

无法弄清楚问题出在哪里。错误发生在我按下链接按钮后的文章页面中。

编辑奇怪的是,如果我尝试以类似 article_path 的方式更改 orm 的 url,它将起作用......

您的控制器缺少respond_to。您的新函数应如下所示:

def new
@paragraph = Paragraph.new
respond_to { |format| format.js }
end

respond_to允许 rails 调用相关的.js.erb文件,在本例中为new.js.erb文件。

请记住,当您想要执行 ajax 调用时,您需要以下几个元素:

  • 控制器操作中的respond_to { |format| format.js }

  • js.erb文件必须与控制器操作同名 (foo.js.erb(

  • 通过js.erb文件呈现的部分,通常与 js 文件的名称相同。(_foo.js.erb(

  • 如果是链接,则需要remote: true.如果它是一个表单,并且您使用的是 rails 5,则可以使用form_with或简单地包含remote: true

最新更新