0

ユーザーが「アイテム」を作成できる単純な Rails アプリがありますが、すべてのアイテムを一覧表示するマスター インデックス ページには、各「アイテム」の横に「表示、編集、および削除」リンクがあります。scaffolding を使用してアイテムを完成させたことが原因であることは理解していますが、作成したアイテムのみを編集できるようにしたいと考えています。前に言ったように、このロジックは現時点では私の頭の少し上にあります。レールにはまったく新しいものです。

ユーザーコントローラー:

class UsersController < ApplicationController
  def show
    @user = User.find_by_username(params[:id])
  end
  def index
    @user = User.find(:all)
  end
end

マスター アイテム ビュー:

<div class="well">
  <h1>All Items</h1>
    <table>
  <tr>
    <th>Title</th>
    <th>Details</th>
    <th>Inquire</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>
<% @items.each do |item| %>
  <tr>
    <td><%= link_to item.title, item_path(item) %></td>
    <td><%= item.content %></td>
    <td><%= mail_to item.email, "Inquire", :cc => "michaelomchenry@gmail.com",
                 :subject => "OverFlow Inquiry Regarding " + item.title %></td>
    <td><%= link_to 'Show', item %></td>
    <td><%= link_to 'Edit', edit_item_path(item) %></td>
    <td><%= link_to 'Destroy', item, confirm: 'Are you sure?', method: :delete %></td>
  </tr>
<% end %>
  </table>

<br />
<%= link_to 'New Item', new_item_path %>
</div>

アイテムモデル:

class Item < ActiveRecord::Base
  attr_accessible :content, :user_id, :title
  validates :content, :length => { :maximum => 140 }
  belongs_to :user
  delegate :email, to: :user
end
4

3 に答える 3

1

そこにはたくさんのものがあります。まず、ユーザーに基づいてアイテム(またはアクション)をフィルタリングできるようにするには、その時点で誰がログに記録されているかを知る必要があります。これにより、ユーザーがログインできるようになります。これは、たとえば、Railsの承認gemであるDeviseを使用して実行できます。Deviseは主に使用され、十分に文書化されています。

Deviseがセットアップされると、ユーザーがログに記録されているかどうかを確認でき(たとえば、before_filterを使用)、Deviseは使用する「current_user」変数を作成します(これはDeviseチュートリアルに示されています)。次に、それを使用して、次のようなアイテムリストをフィルタリングできます。

editable_items = current_user.items

次に、ビューでeditable_itemsを使用します。あなたがしていることは非常に一般的で十分に文書化されたタスクであるため、Deviseチュートリアルを読むことをお勧めします。

于 2013-02-26T07:00:39.193 に答える
1

できればコメントしますが、選択した回答のフォローアップとして@momchenrが投稿した回答(自分の質問に回答)を参照して、これを言わなければならないと思います。

@momcher 書きました:

私はこれをやってしまった:

<% if item.email == current_user.email %>

うまくいきました...大丈夫ですか?

おそらくそうではありません。ただし、それはシステムの設定方法によって異なります。ユーザーが自分の電子メール アドレスを編集できる場合、および/または電子メール アドレスが一意である必要がない場合、電子メール アドレスを一時的に変更するか、新しいユーザーとしてサインアップするだけで、別のユーザーの「アイテム」への編集アクセスを取得できる可能性があります。既知のユーザーの電子メール アドレス。

アプリケーションでユーザーの電子メール アドレスをまったく表示しない場合でも、認証プロセスの多くをユーザー提供のフィールドに残しておくと、固有の脆弱性が存在します。

あなたが提供した情報だけに基づいて、Devise でどのように設定されているか正確にはわかりませんが、次のことを試してみます。

これら 2 つは、呼び出されたときの ActiveRecord の状態によっては少し遅くなる可能性があります。

  • <% if item.user == current_user %>
  • <% if item.user.id == current_user.id %>

userオブジェクトからオブジェクトを取得していないため、これは少し速くなるはずです(オブジェクトのメソッドitemから直接プルしているだけです)user_iduser

  • <% if item.user_id == current_user.id %>

私の推測が正しいか間違っているかに関係なく、これは一般的に、あなたが言った解決策よりも優れています。ユーザーの ID が直接制御されることはないため (コードに大きな穴がない限り)、他のユーザーになりすますことは容易ではありません。

于 2013-09-13T04:15:09.503 に答える
0

私はこれをやってしまった:

<% if item.email == current_user.email %>

うまくいきました...大丈夫ですか?

于 2013-03-03T01:28:41.730 に答える