什么是使用javascript渲染部分的Rails方式

时间:2015-11-17 09:15:03

标签: javascript jquery ruby-on-rails coffeescript

我有一个角色创建表单,它有两个选择输入clanfamily,它们基于clan,所以Dragon族有不同的家族,然后是狮子族。

我的目标是重新渲染_character_form部分。 我做了一个coffeescript函数,当clan select更改时呈现new.js.erb,而在new.js.erb表单中我只渲染_form partial:

$(document).on 'change', '#character_clan', ->
  character_clan = $(this).val()
  character_name = $('#character_name').val()
  character_desc = $('#character_desc').val()
  $.get(window.location, { name: character_name, clan: character_clan, desc: character_desc  }) ->  

它运行良好,但是当表单失败时,该函数停止工作,因为它在创建操作中,并且我没有创建操作的路径。

我的问题是:

有没有办法从javascript加载juts的一部分?或者我必须制作,字符#create route,或者有不同的方法来做到这一点?

2 个答案:

答案 0 :(得分:0)

  

有没有办法从javascript加载juts的一部分?或者我必须制作,character#create路线,还是有不同的方式来做到这一点?

答案更具结构性而非具体 -

首先,您需要了解Javascript!= Rails

  • JS - 客户端
  • Rails - 服务器端

虽然在某些情况下您可以在JS中使用Ruby ERB代码,但在99%的情况下,您不应将任何与Rails相关的代码放入资产管道中。

这是你问题的症结所在 - 你正试图打电话给"部分"必须动态创建。如果您通过javascript(Ajax等)将数据传递到服务器,则方式会发生这种情况:

#app/views/characters/new.html.erb
<%= form_for @character, remote: true do |f| %>
   <%= f.collection_select :clan_id, Clan.all, :id, :name %>
   <%= f.text_field :name %>
   <%= f.text_field :description %>
   <%= f.submit %>
<% end %>

#app/controllers/characters_controller.rb
class CharactersController < ApplicationController
   def new
      @character = Character.new
   end

   def create
      @character = Character.new character_params
      @character.save
   end

   private

   def character_params
      params.require(:character).permit(:name, :clan_id, :description)
   end
end

-

  

有没有办法从javascript加载juts部分

是的,但它不是部分(除非您希望它) - 建议您说明您需要的特定功能。

这里的魔法将以layout的形式出现。

你提到你要渲染一个&#34; partial&#34; - 您真正要问的是...... 如何从控制器中呈现只是视图?。答案是根据请求是html还是xhr来设置布局:

#app/controllers/characters_controller.rb
class CharactersController < ApplicationController
   layout Proc.new { |c| c.request.xhr? ? false : "application" }
end

这将使您能够创建相应的character记录。

-

我打算写一下resourceful routing等的需要 - 如果你想让我更新答案,我当然会这样做。

答案 1 :(得分:-1)

类似于js.erb文件中的内容

<%= raw escape_javascript(render('partial_name', :variable => @variable))%>