【问题标题】:Passing in Params to JS.ERB file from controller? [Rails 3]将参数从控制器传递给 JS.ERB 文件? [导轨 3]
【发布时间】:2012-06-05 00:05:04
【问题描述】:

我正在尝试允许用户将已保存的任务“导入”到教学大纲帖子中。教学大纲有许多任务,教学大纲表单是一个嵌套表单,用户可以在其中“添加任务”,这将附加一个新的任务文本框。

当我“导入”任务时,我希望 javascript
1.点击“添加任务”链接(添加嵌套表单)
2.在ckeditor文本框中输入“导入任务”的值。

_IMPORT_FORM.HTML.ERB

 <%= form_tag(import_missions_path, :method => :post, :id => "import-js" )  do |f| %>
  <ul>
  <% current_user.folders.find_by_order(1).missions.each do |mission| %>
<li> <%= check_box_tag "mission_ids[]", mission.id %>
  <%= mission.id.to_s + ". " + mission.title %> </li>
  <% end %>
  </ul>
  <%= submit_tag "Import ", :class => 'btn btn-primary' %>
<% end %>

然后转到 SYLLABUSES#IMPORT

def import
@missions_hash = []
    #loop through each mission id from :missions_id
params[:mission_ids].each do |id|
 @missions_hash << Mission.find(id)
end
respond_to do |format|
  format.html { redirect_to edit_syllabus_path(@syllabus), notice: "imported" }
  format.js { render 'folders/import.js' }
end
end

然后我想渲染 IMPORT.JS.ERB 文件,并传入@missions_hash。下面的代码可能是错误的,这是我需要帮助修复它的地方。

IMPORT.JS.ERB

//loop for each mission passed in 
<% @mission_hash.each do |mission| %>
  //click add missions
  $('#add-missions-button').trigger('click');
  //pass in mission.title & mission.content to form textbox value
<% end %>

将 Ruby 参数传递到这个 Javascript.erb 文件的正确语法是什么?另外,我想将导入的任务的“标题”和“内容”复制到新添加的任务表单框中:

  <%= f.text_field :title, :class =>'row span6' %>
  <%= f.cktext_area :content, :toolbar => 'MyToolbar', :class => 'row span6', :rows => '5', :placeholder => "What is the first step a learner should do? (e.g. Watch an intro video, read certain article)" %>

如何将其复制到这些文本框的值中,以便用户在导入后对其进行编辑?

我意识到这个问题的组织很糟糕,但我试图在不解释整个背景的情况下使其尽可能简单。我还是个初学者,请谅解..

【问题讨论】:

  • 基本上你试图让视图import.js.erb呈现与视图_import_form.html.erb相同的内容?
  • 不,这样想吧。一天有很多任务,但有时您需要在不同的一天执行相同的任务。因此,您无需每次都键入该任务,而是保存该任务,然后将其“导入”到新的一天。但我不只是想让该任务成为新一天的孩子,因为我想让创建者在文本框中编辑该任务的选项保持打开状态。所以基本上我只想复制任务的内容,然后用 javascript/ajax 把它放到文本框中。

标签: javascript ruby-on-rails ruby-on-rails-3 forms parameters


【解决方案1】:

好的,IMPORT.JS.ERB 是将被发送回您的浏览器的 javascript,但是由于 .ERB 扩展名,它会在控制器的上下文中首先由嵌入式 ruby​​ 处理,然后再发送到浏览器,所以你可以使用标准的 ERB 语法,

 <%= @something %>  

在您的 javascript 中的任何位置来操作被发送回的 javascript,因此您可以这样做:

import.js.erb:

$('#somediv').html('<%= escape_javascript(@missions_hash.inspect) %>');

如果您的页面上有一个 id = 'someday' 的 div,则其内容应设置为missions_hash 的转储。这也假设您使用的是 AJAX,即:

<%= form_tag(import_missions_path, 
  :method => :post, 
  :id => "import-js" , 
  :remote=>true)  do |f| %>

但是,您需要告诉 rails 使用嵌入的 ruby​​ 预处理 javascript 文件,因此您必须进行更改:

render 'folders/import.js'

到

render 'folders/import.js.erb'

有更简洁的方法来完成你想要的,但我认为你现在只需要弄清楚我们嵌入的 ruby​​ 和 javascript 的组合。

【讨论】:

  • 我按照您的建议做了一切,但我不确定它是否仍处理 import.js.erb 文件中的 Ruby 代码。这是我的代码的要点gist.github.com/2879813。在 import.js.erb 文件中,我想遍历 MISSIONS_HASH 并为每个哈希创建一个新的文本框,并用从 MISSIONS_HASH 循环的 MISSION 的一些属性填充文本框
  • 因此,当您选中 _import_form 中的复选框之一时,您希望更新 _mission_fields 中的某些内容。问题,这两个部分是否都呈现在同一页面上?
  • 是的。所以我有一个 _form,在其中,我有多个嵌套的 _missions_fields(当我单击“添加任务”按钮时附加),当我单击 _form 内的按钮时,我将 _import_form 呈现为模式。跨度>
  • 本质上,我想点击按钮[1]将_import_form显示为模态弹出窗口,[2]提交,[3]在_form中添加额外的_mission_fields,[4]填写每个_missions_fields 带有从 _import_form 传入的选中任务的属性
【解决方案2】:

我认为你不应该这样做,因为你会在 sprocket 编译时遇到问题。文件更改时会在第一时间编译。如果你想将变量传递给 js,你可以试试那个 gem client variable

【讨论】:

    猜你喜欢
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多