关注用户的艺术家 - 几乎没有问题

时间:2013-04-07 21:32:40

标签: ruby-on-rails railstutorial.org

我已经在railstutorial.org网站上创建了自己的应用程序,现在我正在chapter 11。一切都很好,我从这个教程中学到了很多,现在我继续在我的应用程序上工作,我实际上在模型“艺术家”,每个用户都可以创建新的艺术家ex.Michael Hartl;)并添加他们最受欢迎报价。问题是允许用户关注他们喜爱的艺术家并在Feed中查看报价,就像来自railstutorial的Microposts feed一样。艺术家和用户是两种不同的模型,并且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

1 个答案:

答案 0 :(得分:0)

您应该设置一个艺术家模型和一个名为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

不要忘记为ArtistUserArtist创建迁移。 UserArtist表应包含user_idartist_id