【问题标题】:Rails3: Is there a best practice for updating attributes without a form?Rails3:是否有在没有表单的情况下更新属性的最佳实践?
【发布时间】:2010-12-25 16:57:53
【问题描述】:

我已经被困在这个问题上几天了,恐怕我缺乏正确提出这个问题的词汇,但非常感谢任何反馈!

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

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

切换公共|私人对应于编辑/更新操作,我无法弄清楚如何使用链接或按钮来做到这一点——看来我必须使用表单。我已经尝试了很多看起来像这样的工作删除按钮的变体(但没有一个工作):

<%= 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();
});

对这两种方法有意见吗?是不是更惯用的一种?

【问题讨论】:

    标签: ajax ruby-on-rails-3


    【解决方案1】:

    我会这样做(未经测试,所以可能会出现一些小错误):

    1. PostsController 中创建名为make_public 的操作

      一个。链接”将是: 'Are you sure?', :method => :put, :remote => true %>

      b.该操作将收到帖子的 id (params[:id])

    2. 在 Post 模型上定义一个名为 make_public 的方法 一种。拨打update_attributes :make_public =&gt; true

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

    【讨论】:

      猜你喜欢
      • 2012-07-03
      • 2012-12-18
      • 2011-03-01
      • 1970-01-01
      • 2011-06-30
      • 2012-05-04
      • 1970-01-01
      • 2011-09-02
      • 2011-07-15
      相关资源
      最近更新 更多