我为特定资源定义了destroy
操作。完成后,它使用具有视觉效果的rjs文件从正在调用它的页面中删除资源。
我的问题是可以从2个不同的模板调用destroy
操作。所以视觉效果需要不同,取决于从哪个模板调用...有没有办法这样做??
1:我认为我可以这样做的一种方法是进行destroy
操作和destroy-variant
操作,其中一个模板调用destroy-variant
操作,另一个模板调用:method => :delete, :action => :destroy-variant
操作称之为正常的...但是,我很确定这是违反DRY的想法。说实话,我也不完全确定如何这样做......在URL选项中使用{{1}}会有效吗?
2:对我来说似乎有可能的另一种方式是找出哪个页面正在调用该操作,然后根据需要推出不同的rjs文件。但我完全不知道如何区分哪个页面正在进行动作调用。
3:最后一种方法是让我重做模板/ RJS,以便同样的视觉效果可以应用于两个模板。
我很欣赏这个建议! :)
答案 0 :(得分:2)
您没有提到您正在使用的JavaScript库。此解决方案基于jquery。使用一个动作destroy
很容易做到你想要的。但我建议采用不同的技术来解决它。我觉得rjs非常有限。转到jquery taconite插件。它的所有标记而不是......一堆与erb混合的javascript,这对眼睛不太有吸引力!
现在,您将destroy.rjs
取代destroy.xml.erb
而不是destroy
。在我进入您需要添加的内容之前,让我们看看您需要对 def destroy
@model = Model.find(params[:id])
@model.destroy
respond_to do |format|
format.html { redirect_to :action => :index }
format.xml
end
end
操作进行哪些修改。
<强> BEFORE:强>
def destroy
@model = Model.find(params[:id])
@model.destroy
@template = params[:template]
respond_to do |format|
format.html { redirect_to :action => :index }
format.xml
end
end
<强> AFTER:强>
map.destroy_using_template 'destroy/:id/:template', :controller => "controller", :action => "destroy"
在routes.rb中添加命名路由以简化操作:
<layout>.html.erb
在您的观点中:
将jquery taconite插件添加到<%= javascript_include_tag "jquery.js", "jquery.taconite.js" %>
,
<%= link_to "Delete", destroy_using_template_path(:id => "1", :template => "temp1"), :method => :delete, :confirm => "Are you sure you want to delete the record?" %>
在模板1的视图中:
假设您使用链接删除。
<%= link_to "Delete", destroy_using_template_path(:id => "1", :template => "temp2"), :method => :delete, :confirm => "Are you sure you want to delete the record?" %>
和模板2相同:
假设您使用链接删除。
destroy.xml.erb
现在在<taconite>
<% if @template=="temp1" %>
<remove select="#template1" />
<% elsif @template=="temp2" %>
<remove select="#template2" />
<% end %>
<eval>
//OPTIONAL: Execute some javascript here if you want. You can do most of the DOM modifications using taconite itself.
alert("HEY!!!");
</eval>
</taconite>
eval
现在不容易吗? :)
请记住,在使用taconite时,您必须确保destroy.xml.erb中的代码符合XML。确保关闭所有打开的标签。在此处阅读有关taconite的更多信息:http://malsup.com/jquery/taconite/
Taconite在标记中实现了所有常规的jquery DOM修饰符,还有一些额外的。如果您想切换到javascript,只需在{{1}}标记中加入javascript即可轻松完成此操作。