【问题标题】:Loading nested resources via ajax (rails)通过 ajax (rails) 加载嵌套资源
【发布时间】:2013-01-02 15:33:31
【问题描述】:

我的路线如下所示:

resources :projects do
  resources :tasks
end

这会为您提供如下 URL:URL/projects/14/tasks/3

模型定义:

project has_many :tasks
task belongs_to :project

现在,当用户单击任务的链接时,我正在通过远程 => true 链接从项目的显示视图中将 tasks#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_&lt;%= task.id %&gt;').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

Projects#show 有两个主要元素:

  1. id 为 task_ 的链接
  2. 任务所在的 div 内容应加载到 (div#task_content)

【问题讨论】:

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


    【解决方案1】:

    基本上,我需要找到一种方法来拥有 URL/projects/14/tasks/3 实际渲染 URL/projects/14,并调用 jquery $('a#task_').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 %>
    

    【讨论】:

    • 谢谢!我添加了控制器(简化)和项目#show 视图生成的解释。 @PinnyM
    【解决方案2】:

    我可能会使用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? }
    

    未经测试但可能会起作用?

    【讨论】:

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