通过ajax(rails)加载嵌套资源

时间:2013-01-02 15:33:32

标签: jquery ruby-on-rails ajax nested-resources

我的路线看起来像这样:

resources :projects do
  resources :tasks
end

它为您提供了如下URL:URL / projects / 14 / tasks / 3

模型定义:

project has_many :tasks
task belongs_to :project

现在,当用户点击指向某个任务的链接时,我正在通过远程=>将任务#show加载到div中。项目展示视图中的真实链接。这很好。

#tasks/show.js.erb

$('#task_content').html("<%= j render(partial: 'tasks/single', locals: { t: @task }) %>");

#tasks/_single.html.erb

<%= t.content %>

问题在于我希望用户能够访问URL / projects / 14 / tasks / 3并自动将任务加载到项目视图中的div中。

基本上,我需要找到一种方法让URL/projects/14/tasks/3实际呈现URL/projects/14,然后调用jquery $('a#task_<%= task.id %>').click()

我似乎无法弄清楚如何让视图识别出这种行为。任何人都可以指出我正确的方向吗?

感谢!!!

修改

#TasksController
  def show
    @task = Task.find(params[:id])
    respond_to do |format|
      format.js
    end
  end


#ProjectsController
  def show
    @project = Project.find(params[:id])
    respond_to do |format|
      format.html # show.html.erb
    end
  end

项目#show有两个主要元素:

  1. ID为task_&lt;%= task.id%&gt;的链接
  2. 任务的div 内容应加载到(div#task_content)

2 个答案:

答案 0 :(得分:1)

  

基本上,我需要找到一种方法来获取URL / projects / 14 / tasks / 3   实际上渲染URL / projects / 14,并调用jquery $('a#task_&lt;%=   task.id%&gt;')。click()

您可以测试标准HTTP调用(非AJAX)是否到达任务,并重定向到项目的URL,传入参数以在加载时自动加载任务。由于您的默认情况使用js格式,因此更简单 - 您只需测试html格式:

#TasksController
def show
  @task = Task.find(params[:id])
  respond_to do |format|
    format.html { redirect_to project_path(@task.project_id, :load_task_id => @task.id) }
    format.js
  end
end

# somewhere in /projects/show partial
<% if params[:load_task_id] %>
  <script type="text/javascript">
    $(function(){
      $('a#task_<%= params[:load_task_id] %>').click()
    });
  </script>
<% end %>

答案 1 :(得分:1)

我可能会使用Rails Routing Constraints将xhr请求定向到任务控制器并将http请求发送到项目控制器,并将任务ID作为参数,使该变量可用于您的视图,然后您的视图可以检查如果任务变量存在并加载div?或者用JS检查URL。

有些事情:

match "/projects/:id/tasks/:tid", :to => "projects#show", :constraints => lambda { |request| !request.xhr? }
match "/projects/:id/tasks/:tid", :to => "tasks#show", :constraints => lambda { |request| request.xhr? }

未经测试,但可能是混蛋?