0

我已经根据 railstutorial.org 网站制作了自己的应用程序,现在我在第 11 章。一切都很好,我从本教程中学到了很多,现在我正在继续开发我的应用程序,我实际上是在模型“艺术家”上,每个用户都可以创建新的艺术家 ex.Michael Hartl ;) 并添加他们最受欢迎的报价单。问题是允许用户关注他们最喜欢的艺术家并在提要中查看引用,就像来自 railstutorial 的 Microposts 提要一样。Artist 和 User 是两个不同的模型,railstutorial 没有解释如何为此创建“跟随系统”。这就像在 YouTube 等上订阅频道。有人可以解释我如何让它工作吗?我必须在代码中更改什么?

答案

按钮:

<%= form_for(current_user.userartists.build(followed_id: @artist.id)) do |f| %>
  <div><%= f.hidden_field :followed_id %></div>
  <%= f.submit "Follow", class: "btn btn-large btn-primary" %>
<% end %>

控制器

class UserartistsController < ApplicationController
def create
@artist = Artist.find(params[:userartist][:followed_id])
current_user.follow!(@artist)
respond_to do |format|
format.html { redirect_to @artist }
format.js
end
end
end
4

1 回答 1

0

您应该设置一个 Artist 模型和一个名为UserArtist(或UserFollowsArtist) 的中间模型,您将在其中存储用户和艺术家之间的所有匹配项。

class User < ActiveRecord::Base
   has_many :user_artists
   has_many :artists, :through => :user_artists
end

class Artist < ActiveRecord::Base
   has_many :user_artists
   has_many :users, :through => :user_artists
end

class UserArtist < ActiveRecord::Base
   belongs_to :user
   belongs_to :artist
end

现在您可以调用@user = User.first获取第一个用户,并@user.artists获取@user以下艺术家列表。

您将必须创建一个单独的控制器,称为UserArtistsController您将有操作的地方create,并且可能destroy(如果用户希望取消关注艺术家)。

在你的routes.rb

resources :user_artists, :only => [:create, :destroy]

我猜这follow button将在Artists显示页面上,因此您的视图中应该有这样的内容:

<%= button_to "Follow artist", {:controller => :user_artists,
      :action => 'create', :artist_id => params[:id] }, :method => :post %>

在你的控制器中:

class UserArtistsController < ActionController
def create 
    @user_artist = UserArtist.create(:user_id => current_user.id, :artist_id => params[:artist_id])
    @artist = Artist.find(params[:artist_id])
    if @user_artist.save
       redirect_to @artist
    else
       flash[:alert] = "Something went wrong, please try again"
        redirect_to root_path
    end
end

end

不要忘记为Artistand创建迁移UserArtistUserArtist表应包含 auser_id和 a artist_id

于 2013-04-07T21:38:04.983 回答