1

モデルが次の場合、製品のサブスクリプションを削除する方法がわかりません。

class User
  has_many :products
  has_many :subscriptions, :foreign_key => :subscriber_id
end

class Product
  has_many :subscriptions, :as => :subscribable
end

class Subscription
  belongs_to :subscriber, :class_name => "User"
  belongs_to :subscribable, :polymorphic => true
end

そして、ビューとコントローラーのセットアップで削除しようとしました:

def unsubscribe_product
  @subscription = Subscription.find(params[:id])
  if @subscription.destroy
    redirect_to :back
  else
    redirect_to :back
  end
end

<td><%= link_to "Unsubscribe", { :controller => "products", 
                                 :action => "unsubscribe_product", 
                                 :id => subscription.id }, 
                                 :method => :delete %></td>

しかし、エラーが発生します:

NameError in Pages#subscribe_area

undefined local variable or method `subscription' for #<#<Class> 

なぜこのように機能しないのかわかりません。サブスクリプションを見つけるためのインスタンスがあります。なぜ使えないのですか?これは、現在のユーザーのサブスクリプションにも自動的にマップされますか?

ありがとう、ヘルプを使用できます。


編集

PagesController & pages/subscribe_area.html.erb

def subscribe_area
    @products = current_user.products
end

<table>
 <% for product in @products %>
  <tbody>
   <tr>
    <td><%= product.name %></td>
    <td><%= product.price %></td>
    <td><%= link_to 'Delete', product, :confirm => 'Are you sure?', :method => :delete %></td>
    <% if current_user.subscribed_for?(product) %>
       <td><%= link_to "Unsubscribe", { :controller => "products", :action => "unsubscribe_product", :id => subscription.id }, :method => :delete %></td>
    <% else %>
       <td><%= link_to "Subscribe", { :controller => "products", :action => "subscribe_product", :id => product.id }, :method => :post %></td>
    <% end %>
   </tr>
  </tbody>
 <% end %>
</table>
4

1 に答える 1

1

リンクのサブスクリプションは、@subscriptionコントローラーで宣言していると言っているようです。それ以外の場合は、ページ コード全体とそれをレンダリングするアクションを確認する必要があります。

更新: したがって、サブスクリプションを定義していません。代わりにこれを試してください:

<td><%= link_to "Unsubscribe", { :controller => "products", :action => "unsubscribe_product", :id => product.id }, :method => :delete %></td>

次に、次のようにアクションを変更します。

def unsubscribe_product
  product = Product.find(params[:id])
  @subscription = product.subscriptions.find_by_subscriber_id(current_user.id)
  if @subscription.destroy
    redirect_to :back
  else
    redirect_to :back
  end
end
于 2012-04-07T23:06:57.867 に答える