我有一个角色创建表单,它有两个选择输入clan
和family
,它们基于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,或者有不同的方法来做到这一点?
答案 0 :(得分:0)
有没有办法从javascript加载juts的一部分?或者我必须制作,
character#create
路线,还是有不同的方式来做到这一点?
答案更具结构性而非具体 -
首先,您需要了解Javascript
!= 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))%>