0

ユーザーは Ruby アプリで互いにメッセージを送信できます。表は次のとおりです。

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

最近、ブール値の :read を追加しました。受信トレイのメッセージにリンクされたフォームがあります。彼らが「Mark Read」(フォーム経由で提供されるリンク) をクリックすると、:read => true にトグルします。

私は現在これを達成することができません。これが私の現在のセットアップです。

_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

「Mark Read」をクリックすると、デバッグ情報が表示されます。

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

コントローラーを使用していないこともわかります...それでもそうです。正しく設定できていないと思います。

これをどのように設定する必要があるかについてのアドバイスをいただければ幸いです。

4

1 に答える 1

0

信じられないかもしれませんが.. モデルもコントローラーも必要ありませんでした:D 私が言ったように、ページ分割されたセット内でレンダリングされます。このページ分割されたセットは、inbox_item.id として識別される @inbox_items で定義されます。

モデルやコントローラーを必要とせずに機能するフォームを次に示します。次のように簡単に定義さ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>
...

そしてそれはそれをやった!:)

于 2012-10-25T06:10:30.577 に答える