我过去曾经使用过RJS来进行RoR项目,并且对它可以做的事情感到非常不安.然而,单独使用Javascript感觉/感觉丑陋和hack-y.在编写操作从变量名自动生成的Rails的Javascript时尤其如此.我最近在博客圈里没有看到很多关于RJS的讨论.RJS是否被用于新的RoR项目或人们认为它无效?它是否仍在积极开发,其功能覆盖面扩大了?我很欣赏对当前事态的一些见解.
那么,谁在使用RJS(以及它如何为您服务)以及谁在使用javascript?
我使用rails 3.0.0.beta
是否有任何新的语法来编写RJS,这是一个例子
def remote_create
@photo = Photo.new(params[:photo])
respond_to do |format|
if @photo.save
# add @photo's thumbnail to last import tag
format.js {
render :update do |page|
page.insert_html :bottom, 'polaroids' , :partial => 'polaroid', :locals => {:photo => @photo}
end
}
else
#...
end
end
end
Run Code Online (Sandbox Code Playgroud) 嗨,目前我正在将我的项目从rails 3.2升级到rails 4.升级到rails 4. page.replace_html方法不起作用属性.
例如:
在控制器中如果遇到这样的代码,
渲染:更新do | page |
page.replace_html"lease_container",:partial =>"/ lease/property_pipeline",:locals => {:note_collection => @note}
结束
它抛出这样的错误,
ActionView :: MissingTemplate(缺少模板租约/更新,应用/更新{:locale => [:en],:formats => [:js,:html,:xml,:html,:text,:js,:css ,:ics,:csv,:png,:jpeg,:gif,:bmp,:tiff,:mpeg,:xml,:rss,:atom,:yaml,:multipart_form,:url_encoded_form,:json,:pdf,: zip] ,: handlers => [:erb,:builder,:raw,:ruby,:rjs]}
我怎么能解决这个问题?有什么替代方法可以用jquery做到这一点吗?
关于RJS最方便的一点是它能够渲染部分内容,因此您可以在一个地方拥有所有视图代码:
# task/index.html.erb
<ul id="task_list">
<%= render :partial => 'task', :collection => @tasks %>
</ul>
# task/_task.html.erb
<li>
<% if task.is_completed %>
<%= task.name %> - <%= task.completed_date %>
<% else %>
<%= task.name %> - UNCOMPLETED
<% end %>
...
</li>
Run Code Online (Sandbox Code Playgroud)
现在我正试图摆脱RJS并让服务器以一个小的,格式良好的JSON而不是大量的JS + HTML进行响应.
有没有办法保持我的部分文件和代码没有重复,并能够通过JS添加新项目而不使用RJS?我已经研究了一些javascript模板引擎,但它们都需要我维护一个单独的ruby部分和一个javacript模板.
我最近开始学习基于RoR3 beta/RC的Ruby on Rails.我之前使用其他框架(如Django)开发应用程序,其中JavaScript完全由我自己编写.
在使用RoR开发应用程序时,我对实现JavaScript的两种可能方式感到困惑:"纯"方法(编写JavaScript并将其放入<script>标记中)和编写RJS文件.
应该使用哪种方法以及何时使用?如果是RJS,我该如何实现特定的操作onChange呢?
由于我在上一个问题上没有得到预期的答案,我会尝试简化和缩小我的问题:
如何构建一个使用AJAX(无提交按钮)来调用某个控制器的show动作的下拉菜单?
给出以下内容:
模型关联是类别HABTM项目,因此下拉菜单包含所有类别名称.
应该实现下拉菜单的视图部分.下拉菜单下方是一个项目列表,应根据下拉菜单中的选择进行更改:
<!-- placeholder for AJAX dropdown menu -->
<!-- list of projects related to categories chosen by the select tag -->
<ul class="projects">
<% @projects.each do |_project| %>
<li>
<%= link_to(_project.name, _project) %>
</li>
<% end %>
</ul>
Run Code Online (Sandbox Code Playgroud)
具有应该调用的show-action 的Categories控制器:
class CategoriesController < ApplicationController
def show
# params[:id] should be the choice the user made in the dropdown menu
@category = Category.find(params[:id])
@projects = @category.projects.find(:all)
respond_to do …Run Code Online (Sandbox Code Playgroud) 我有一个id为"foo"的文本域,有时存在,有时不存在.如果它存在,我想填写一定的价值.
你是如何通过使用RJS(在Rails 2.2中)这样做的?
我尝试过这个并不起作用:
if page[:foo]
page[:foo].value = "bar"
end
Run Code Online (Sandbox Code Playgroud)
我明白了
TypeError:Null如果文本字段不存在,则为Value
.
嘿伙计们,你们中的任何人都知道Rails中的RJS机制有任何好的参考(2.3.8)我可以找到类似2006/2007的一些例子而没有实际的文档.
如何只重新加载页面上的div id?我只需要重新加载某个div.
在我的控制器中我有
def mycontrolleraction
...
render(:update) do |page|
reload_only_the_div('adiv'), :controller => 'my_controller'
end
end
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我试图用RJS替换DOM中的div.这是我试过的代码,控制器有这个方法:
def change
render :update do |page|
page.replace(:test_id, :partial => "input",:locals =>{ :type => 'text', :name => 'user[user][contactinfo][city]', :val => "", :size => '244', :placeholder_text => 'Yes it is working...'})
end
end
Run Code Online (Sandbox Code Playgroud)
该视图包含:
<div id = "test_id"></div>
<%= link_to "AJAX", "/poc/change", :remote => true %>
Run Code Online (Sandbox Code Playgroud)
现在我想div id="test_id"用部分提到的替换.
我得到的输出是:
try {
Element.replace("test_id", "<input type=\"text\" id=\"user[user][contactinfo][city]\" name=\"user[user][contactinfo][city]\" value=\"\" placeholder=\"Yes it is working...\" style=\"width:244px; height:33px; border:0; color:#646464; background:url(/images/form_textfield_244.png) 0 5px no-repeat; padding:12px 5px 0 5px; margin:0 0 10px 0;\" />\n");
} …Run Code Online (Sandbox Code Playgroud)