1

ユーザーが記事をフォローまたはフォロー解除できるアプリを作成しようとしています。Customerそのために、Articleとの 3 つのモデルを作成しましPinた。

これらは関係です:

Customer
  has_many articles
  has_many pins
Article
  has_many pins
  belongs_to customer
Pins
  belongs_to customer
  belongs_to article

a は an 内にネストするPin必要があると思いますArticle。私のroute.rb見た目は次のようになります:

resources :articles do
  resources :pins, :only => [:create, :destroy]
  end
end

article#indexリレーションシップを作成または破棄するためのフォームがあります。

# To create
<%= form_for [article, current_customer.pins.new] do |f| %>
  <%= f.submit "Pin" %>
<% end %>
# To destroy which doesn't work because i guess you can't do the form like that
<%= form_for [article, current_customer.pins.destroy] do |f| %>
  <%= f.submit "Pin" %>
<% end %>

対応するコントローラー アクションは次のとおりです。

def create
  @article = Article.find(params[:article_id])
  @pin = @article.pins.build(params[:pin])
  @pin.customer = current_customer

  respond_to do |format|
    if @pin.save
      format.html { redirect_to @pin, notice: 'Pin created' }
    else
      format.html { redirect_to root_url }
    end
  end
end

def destroy
  @article = Article.find(params[:article_id])
  @pin = @article.pins.find(params[:id])
  @pin.destroy

  respond_to do |format|
    format.html { redirect_to root_url }
  end
end

ここで私の2つの質問:

  • 現在の関係を削除するフォームを作成するにはどうすればよいですか?
  • 私のフォームでは、ボタンの 1 つだけを表示したいと考えています。条件付きで正しいボタンを表示するにはどうすればよいですか?
4

1 に答える 1

1

関係を削除するためのフォームは必要ありません。リンクで問題ありません。インデックス ビューで記事を反復処理することになると思いますが、そうであれば、次のようなものはどうでしょうか。

<% @articles.each do |article| %>

  ...

  <% if (pin = current_customer.pins.find_by_article(article)) %>
    <%= link_to 'Unfollow', articles_pin_path(article, pin), :confirm => "Are you sure you want to unfollow this article?", :method => :delete %>
  <% else %>
    <%= link_to 'Follow', articles_pins_path(article), :method => :post %>
  <% end %>
<% end %>

レコードの作成/破棄に使用する場合の注意点の 1 つlink_toは、JavaScript が無効になっている場合、POST/DELETE ではなく GET を使用するようにフォールバックすることです。詳細については、ドキュメントを参照してください。

于 2012-08-24T22:05:05.150 に答える