Rails3:没有表单更新属性是否有最佳实践?

时间:2010-12-25 16:57:53

标签: ajax ruby-on-rails-3

我已经被困在这几天了,我担心我没有足够的词汇来正确地提出这个问题,但是非常感谢任何反馈!

我正在开发一个基本的博客网站。用户可以创建具有标题,描述的帖子,并声明其他人是否可以看到帖子(公共或私人)。从索引页面,我希望用户能够看到他们的帖子列表,切换public | private,并删除帖子。列表很简单(我根据用户的帖子呈现部分内容),并且AJAX删除链接运行良好:

<%= link_to 'Delete Post', post, :confirm => 'Are you sure?', :method => :delete, :remote => true %>

切换public | private对应于编辑/更新操作,我无法弄清楚如何使用链接或按钮执行此操作 - 似乎我必须使用表单。我已经尝试了很多工作删除按钮的变体,看起来像这样(并且没有工作):

<%= link_to 'Make Public', { :controller => "posts", :action => "update", :id => post, :public => true, :post => post }, :method => :put, :remote => true %>

似乎工作的唯一方法是使用表单,但这需要用户单击Update Post按钮:

<%= form_for(post, :remote => true) do |f| %>
  <div class="field">
    <%= f.label :public %><br />
    <%= f.check_box :public %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

那么,在Rail3中,更新单个属性的正确方法是什么? (是否有更合适的措辞?)可以使用链接或按钮完成吗?我必须使用表格吗?是否有Rails3方式(如destroy.js.erb)添加onclick / onchange事件或者我是否需要开发自己的JavaScript?


Zabba的答案很棒;但是,我最终使用了一个通过JavaScript(特别是jQuery)提交的隐藏表单。

在视图中:

<div>
  <%= form_for(post, :remote => true) do |f| %>
    <%= f.hidden_field :public, { :value => !post.public } %>
  <% end %>
  <% if post.public == true %>
    <div class="pp">Public</div>
  <% else %>
    <div class="pp">Private</div>
  <% end %>
</div>

JavaScript:

$('.pp').live('click', function(){
  $(this).siblings('form').submit();
});

对这两种方法的评论?还有一个惯用的吗?

1 个答案:

答案 0 :(得分:4)

我会这样做(没有经过测试,可能会出现一些小错误):

  1. make_public

    中创建名为PostsController的操作

    一个。链接“将是:&lt;%= button_to'公开',:确认=&gt;'你确定吗?',:method =&gt;:put,:remote =&gt; true%&gt;

    湾该操作将收到帖子的ID(params[:id]

  2. 在Post模型上定义一个名为make_public的方法 一个。致电update_attributes :make_public => true

  3. 执行更新的链接应该是PUT 而不是 GET(始终将所有状态更改操作放在POST或PUT后面)