3

我有如下所示的路线:

resources :projects do
  resources :tasks
end

它给你一个这样的 URL: URL/projects/14/tasks/3

这些模型定义:

project has_many :tasks
task belongs_to :project

现在,当用户单击任务的链接时,我正在通过远程 => true 链接从项目的显示视图中将任务#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

Projects#show 有两个主要元素:

  1. id 为 task_<%= task.id %> 的链接
  2. 任务内容应加载到的 div (div#task_content)
4

2 回答 2

1

基本上,我需要找到一种方法让 URL/projects/14/tasks/3 实际呈现 URL/projects/14,并调用 jquery $('a#task_<%= task.id %>').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 %>
于 2013-01-02T15:38:59.937 回答
1

我可能会使用Rails 路由约束将 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? }

未经测试,但可能会工作?

于 2013-01-02T16:13:01.233 回答