Ruby on Rails 3:使用Forms切换布尔值

时间:2012-10-25 03:14:09

标签: ruby-on-rails ruby-on-rails-3 forms oop class

用户可以在我的Ruby应用程序上发送彼此的消息。表格如下:

t.string   "content"
t.integer  "from_id"
t.integer  "reply_to_id"
t.boolean  "read",       :default => false

我最近添加了boolean,:read,并且我将表单链接到收件箱中的邮件。当他们点击“标记阅读”(通过表单提供的链接)时,我希望它切换:read =>真正。

我目前无法完成此任务。这是我目前的设置。

_mark_read.html.erb
  <%= form_for(:message, :mark_read => {read: true}) do |f| %>
    <div><%= f.hidden_field :read %></div>
    <%= f.submit "Mark Read", class: "btn-link" %>
  <% end %>

Class MessagesController < ApplicationController
  def mark_read
    @message = current_user.messages.build
    @message.toggle!(:read)
  end

config/routes.rb
 match '/mark_read' => 'messages#mark_read', :via => :post, :as => :mark_read

当我点击“标记读取”时,这是我的调试信息:

--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess
utf8: ✓
authenticity_token: ---
message: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
  read: 'false'
commit: Mark Read
controller: static_pages
action: connect

我可以看到它甚至没有使用我的控制器......即便如此;我认为我的设置不正确。

对于如何设置这一点的任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

信不信由你。我甚至不需要模型,也不需要控制器:D正如我所说,它是在一个分页集中呈现的。此分页集在@inbox_items中定义,标识为inbox_item.id。

这是无需任何模型或控制器即可运行的表单。它只是在config/routes.rb中定义为:

match '/mark_read' => 'messages#mark_read', :via => :post

表格:

<ul class="share-actions" id="mark_read<%= inbox_item.id %>">
  <%= form_for :mark_read do |f| %>  
    <%= f.check_box inbox_item.toggle!(:read) %>
    <%= f.submit "Mark Read", class: "btn btn-link" %>
  <% end %>
</ul>

嗯,好吗? :d

如果您感到好奇,请提供更多信息。渲染的@inbox_items的基类是Class Message。消息定义用户的所有私人帖子。在User类中,我开始设置如何定义@inbox_items:

Class User
  def inbox
    Message.from_users_inbox(self)
  end

然后我构建其余部分:

Class Message
  def self.from_users_inbox(user)
    "SELECT best_friend_id FROM friendships WHERE new_friend_id = :user_id"
    where("user_id = :user_id OR reply_to_id = :user_id", user_id: user.id)
  end

MemberpagesController
  def inbox
    @message = current_user.messages.build
    @inbox_items = current_user.inbox.paginate(page: params[:page])
  end

feeds/_inbox.html.erb
  <% if @inbox_items.any? %>
    <%= render: 'feeds/inbox_item', collection: @inbox_items %>
    <%= will_paginate @inbox_items %>
  <% end %>

最后:

feeds/_inbox_item.html.erb
  <div id="<%= inbox_item.user.name %>_<%= inbox_item.id %>">
  ...
    <ul class="share-actions" id="mark_read<%= inbox_item.id %>">
      <%= form_for :mark_read do |f| %>  
        <%= f.check_box inbox_item.toggle!(:read) %>
        <%= f.submit "Mark Read", class: "btn btn-link" %>
      <% end %>
   </ul>
...

就这样做了! :)