Rails - 如何区分不同页面的动作调用?

时间:2010-07-04 14:09:59

标签: ruby-on-rails templates action rjs

我为特定资源定义了destroy操作。完成后,它使用具有视觉效果的rjs文件从正在调用它的页面中删除资源。

我的问题是可以从2个不同的模板调用destroy操作。所以视觉效果需要不同,取决于从哪个模板调用...有没有办法这样做??

1:我认为我可以这样做的一种方法是进行destroy操作和destroy-variant操作,其中一个模板调用destroy-variant操作,另一个模板调用:method => :delete, :action => :destroy-variant操作称之为正常的...但是,我很确定这是违反DRY的想法。说实话,我也不完全确定如何这样做......在URL选项中使用{{1}}会有效吗?

2:对我来说似乎有可能的另一种方式是找出哪个页面正在调用该操作,然后根据需要推出不同的rjs文件。但我完全不知道如何区分哪个页面正在进行动作调用。

3:最后一种方法是让我重做模板/ RJS,以便同样的视觉效果可以应用于两个模板。

我很欣赏这个建议! :)

1 个答案:

答案 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即可轻松完成此操作。