2015-11-20 82 views
1

在我的Rails 4的应用程序,我有一个CalendarPost机型,采用shallow路线:轨道4:自定义操作只更新PARAM与AJAX

resources :calendars do 
    resources :posts, shallow: true 
end 

日历has_many后和后belong_to一个日历。

我已经在show.html.erb视图中使用的Posts#Update动作AJAX调用更新后的自定义:approval PARAM:在我Posts#Update控制器

  • respond_to do |format| format.js end
  • 我有一个update.js.erb查看在app/views/posts/重新加载相应部分的帖子show.html.erb查看
  • 当然,我的链接设置为remote: true

现在,我需要实现类似的功能,更新后的定制:approval PARAM,但其中显示的所有职位日历show.html.erb视图。

这是目前我已经在我的日历show.html.erb观点:

<td class="cell_content_center post_approval_section"> 
    <% if post.approval == "ok" %> 
    <span class="ok_green"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "ok"), remote: true, :method => :patch do %> 
     <span class="glyphicon glyphicon-ok" data-toggle="tooltip" data-placement="left" title="Approve Post"></span> 
    <% end %> 
    </span><br/> 
    <% if post.approval == "edit" %> 
    <span class="edit_yellow"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "edit"), remote: true, :method => :patch do %> 
    <span class="glyphicon glyphicon-repeat" data-toggle="tooltip" data-placement="left" title="Require Edits"></span> 
    <% end %> 
    </span><br/> 
    <% if post.approval == "remove" %> 
    <span class="remove_red"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "remove"), remote: true, :method => :patch do %> 
    <span class="glyphicon glyphicon-remove" data-toggle="tooltip" data-placement="left" title="To Be Deleted"></span> 
    <% end %> 
    </span> 
</td> 

此代码可以让我真正从日历show.html.erb更新后的自定义:approval PARAM。

但我不知道如何重新加载页面,甚至更好,只需重新加载链接所在的post_approval_sectiontd

我不能再用我的show.html.erb使用完全相同的方法,因为我已经为Posts#Update行动建立一个JS响应。

我该如何做这项工作?

-----

UPDATE:基于长阮答案,这里是我现在在哪儿。

#calendars/show.html.erb and calendars/_post_approval.html.erb 

<td class="cell_content_center post_approval_section"> 
    <% if post.approval == "ok" %> 
    <span class="ok_green"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "ok"), remote: true, approval_update: true, :method => :patch do %> 
     <span class="glyphicon glyphicon-ok" data-toggle="tooltip" data-placement="left" title="Approve Post"></span> 
    <% end %> 
    </span><br/> 
    <% if post.approval == "edit" %> 
    <span class="edit_yellow"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "edit"), remote: true, approval_update: true, :method => :patch do %> 
    <span class="glyphicon glyphicon-repeat" data-toggle="tooltip" data-placement="left" title="Require Edits"></span> 
    <% end %> 
    </span><br/> 
    <% if post.approval == "remove" %> 
    <span class="remove_red"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "remove"), remote: true, approval_update: true, :method => :patch do %> 
    <span class="glyphicon glyphicon-remove" data-toggle="tooltip" data-placement="left" title="To Be Deleted"></span> 
    <% end %> 
    </span> 
</td> 

#posts_controller.rb 

def update 
    if params["approval_update"] 
     respond_to do |format| 
     format.js { render :action => "update_post_approval" } 
     end 
    else 
     respond_to do |format| 
     if @post.update(post_params) 
      format.html { redirect_to post_path(@post) } 
      format.json { render :show, status: :ok, location: @post } 
      format.js 
     else 
      format.html { render :edit } 
      format.json { render json: @post.errors, status: :unprocessable_entity } 
     end 
     end 
    end 
    end 

    def update_post_approval 
    respond_to do |format| 
     format.js 
    end 
    end 

#update_post_approval.js.erb 

$('td.post_approval_section').html('<%= j render(partial: "calendars/post_approval") %>'); 

当我点击其中一个链接更新后批准,浏览器中没有任何反应。

但是,log/development.log,我有:

Started PATCH "/posts/42?post%5Bapproval%5D=edit" for ::1 at 2015-11-19 19:59:51 -0800 
Processing by PostsController#update as JS 
    Parameters: {"post"=>{"approval"=>"edit"}, "id"=>"42"} 
    [1m[36mUser Load (1.1ms)[0m [1mSELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1[0m [["id", 1]] 
    [1m[35mPost Load (2.2ms)[0m SELECT "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT 1 [["id", 42]] 
    [1m[36m (1.1ms)[0m [1mBEGIN[0m 
    [1m[35mSQL (1.1ms)[0m UPDATE "posts" SET "approval" = $1, "updated_at" = $2 WHERE "posts"."id" = $3 [["approval", "edit"], ["updated_at", "2015-11-20 03:59:51.203371"], ["id", 42]] 
    [1m[36mSQL (3.6ms)[0m [1mINSERT INTO "versions" ("event", "object", "whodunnit", "created_at", "object_changes", "item_id", "item_type") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"[0m [["event", "update"], ["object", "---\nid: 42\ncalendar_id: 8\ndate: 2015-11-19 20:19:00.000000000 Z\nsubject: Armistice 2\nformat: Image\ncopy: Joyeux 11 novembre tout le monde. ++\ncreated_at: 2015-11-19 20:19:58.244685000 Z\nupdated_at: 2015-11-20 03:59:44.073894000 Z\nimage_file_name: armistice.jpg\nimage_content_type: image/jpeg\nimage_file_size: 35967\nimage_updated_at: 2015-11-19 20:19:57.792047000 Z\nshort_copy: etg'tg' <<\nscore: \nfacebook: true\ntwitter: true\ninstagram: false\npinterest: false\ngoogle: false\nlinkedin: false\ntumblr: \nsnapchat: \napproval: ok\n"], ["whodunnit", "1"], ["created_at", "2015-11-20 03:59:51.203371"], ["object_changes", "---\napproval:\n- ok\n- edit\nupdated_at:\n- 2015-11-20 03:59:44.073894000 Z\n- 2015-11-20 03:59:51.203371000 Z\n"], ["item_id", 42], ["item_type", "Post"]] 
    [1m[35m (2.0ms)[0m COMMIT 
    Rendered posts/_approval.html.erb (0.6ms) 
    Rendered posts/update.js.erb (2.1ms) 
Completed 200 OK in 59ms (Views: 10.9ms | ActiveRecord: 11.1ms) 

我在做什么错在这里?

-----

回答

1

我拿出2层的思想来处理这种情况:

第一种方式:过程,当你从日历show.html.erb更新帖子在另一个PARAM,所以link_to将是:

<%= link_to post_path(:id => post.id, "post[approval]" => "remove", approval_update: true), remote: true, :method => :patch do %> 

然后在你的邮政控制器上update动作,你可以过滤这个请求approval_update param:

现在210
if params["approval_update"] 
    respond_to do |format| 
    format.js { render :action => "update_post_approval" } 
    end 
else 
    respond_to do |format| 
    ... 
    end 
end 

当你从日历 show.html.erb更新后,邮政控制器将加载RAILS_ROOT/app/views/posts/update_post_approval.js.erb,而不是update.js.erb

方式二:创建更新的另一条路线后批准属性,这意味着您还将在Post控件中创建另一个动作,以处理日历页面中AJAX更新的情况。

+0

非常感谢。我正在尝试**第一种方式**。有没有办法可以选择在Posts#Update控制器中调用哪个.js.erb文件? –

+0

感谢您的加入。然后,我猜,在'update_post_approval.js.erb'中,我重新加载了与类post_approval_section相对应的div的部分,究竟是什么?另外,我是否需要为新的'update_post_approval'创建一个新路线? –

+0

是的,您可以通过'.js.erb'轻松操作DOM。 –

0

我想你应该能够做到这一点与条件在js。ERB:

<% if @post.approval === 'ok' %> 
    $('td.post_approval_section').replaceWith("<%= j render(:partial => 'calendar/approval') %>"); 
<% else %> 
// you current update post code 
<% end %> 

与移动代码一起_approval.html.erb

<% if post.approval == "ok" %> 
    <span class="ok_green"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "ok"), remote: true, :method => :patch do %> 
     <span class="glyphicon glyphicon-ok" data-toggle="tooltip" data-placement="left" title="Approve Post"></span> 
    <% end %> 
    </span><br/> 
    <% if post.approval == "edit" %> 
    <span class="edit_yellow"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "edit"), remote: true, :method => :patch do %> 
    <span class="glyphicon glyphicon-repeat" data-toggle="tooltip" data-placement="left" title="Require Edits"></span> 
    <% end %> 
    </span><br/> 
    <% if post.approval == "remove" %> 
    <span class="remove_red"> 
    <% else %> 
    <span class="approval_blue" %> 
    <% end %> 
    <%= link_to post_path(:id => post.id, "post[approval]" => "remove"), remote: true, :method => :patch do %> 
    <span class="glyphicon glyphicon-remove" data-toggle="tooltip" data-placement="left" title="To Be Deleted"></span> 
    <% end %> 
    </span> 

希望有所帮助。

+0

感谢您的回答,这对于有经验的人来说是必须有意义的。由于我是新手,我不得不说我很困惑。我在'app/views/posts'中已经有'_approval.html.erb'文件。另外,什么代码应该去你说'//你当前更新邮政编码'? –