3

モデルに削除機能を追加しようとしています。これは私が思いついたものですが、何かを削除するためにページをレンダリングする必要がないにもかかわらず、Rails はレンダリングし、「delete.html.erb」のファイルを見つけることができませんでした。

Ruby 2.0dev と Rails 4.0 を使用しています

私の削除リンク:

<%= link_to "Delete", reservation_delete_path(item), :class => "btn btn-small btn-danger", method: :delete, data: {confirm: 'Are you sure?'} %></td>

私のルートファイル:

match 'reservations/delete/:id' => 'reservations#delete', via: :delete, :as => 'reservation_delete'

私のコントローラー:

def delete
  @current = Reservations.find(params[:id])
  if current_user
    if @current.user_id == current_user.id
      @current.destroy!
      redirect_to reservations_path
    else
      redirect_to reservations_path
    end
  else
    redirect_to reservations_path
  end
end
4

5 に答える 5

3

条件ごとにリダイレクトを 3 回複製する必要はありません。delete メソッドを簡略化できます。

def delete
  @current = Reservations.find(params[:id])

  if current_user && @current.user_id == current_user.id
    @current.destroy!
  end

  redirect_to reservations_path
end

あなたの質問でcurrent_userは、利用できない場合、リダイレクトがないため、暗黙的なレンダリングが実行されています。

于 2013-10-24T01:45:55.957 に答える
1

あなたのセットアップは慣用的ではなく、含めなかったコードがあるため、何かがうまくいかない可能性があります. たとえば、ルート ファイル全体を指定することはできません。インデックス/表示/編集/削除ボタンがあるページを指定するものは何もありません。別の例: アクションはdeleteではなく名前が付けられますdestroy。とにかく、機能し、より標準的な例を示すことができます。

モデル/予約.rb:

class Reservation < ActiveRecord::Base
end

コントローラー/予約_コントローラー.rb:

class ReservationsController < ApplicationController
  def index
    @reservations = Reservation.all
  end

  def destroy
    @reservation = Reservation.find(params[:id])
    @reservation.destroy

    redirect_to reservations_url
  end
end

ビュー/予約/index.html.erb:

<% @reservations.each do |reservation| %>
  <%= link_to 'Destroy', reservation, method: :delete, data: { confirm: 'Are you sure?' } %>
<% end %>

<%= reservation.name %>(これは文字通り、対応する予約を削除するためのリンクのみを表示します...詳細を表示したい場合は、そこに固執する必要があります)

config/routes.rb:

Howdy::Application.routes.draw do
  resources :reservations, only: [:index, :destroy]
  root 'reservations#index'
end

(私のアプリ名はhowdyです)

ユーザー認証が行われているので、それに応じて追加します。アクションを実行する前に特別なユーザー認証を行うコントローラーから継承している場合、それがレンダリングしようとしている理由かもしれませんdelete.html.erb

于 2013-10-24T01:57:47.967 に答える
-1

2つのこと:

削除 (破棄) アクションは、routes ファイルで指定すると、リソースの一部になります。これを「レール」の方法で行うには、ルートファイルを次のようにすることを検討してください。

resources: :reservations, only: [:delete]

...次に、削除リンクを次のようにします。

<%= link_to 'Delete', delete_reservation_path(item), :class => 'btn btn-small btn-danger', method: :delete, data: {confirm: 'Are you sure?'} %>

...そして、コントローラーで次のことができます。

def destroy
  @current = Reservations.find(params[:id])
  if current_user
    if @current.user_id == current_user.id
      @current.destroy!
      redirect_to reservations_path
    else
      redirect_to reservations_path
    end
  else
    redirect_to reservations_path
  end
end

...または、削除アクション用のrjsテンプレートを実際に作成して、派手なjavascript作業を行うか、単にインデックスアクション用のビューをレンダリングすることができます(リダイレクトをより高速にロードします)。

于 2013-10-21T19:54:34.037 に答える