2013-04-07 2 views
0

Я сделал свое приложение, основанное на сайте railstutorial.org, и теперь я нахожусь на chapter 11. Все в порядке, я многому научился в этом учебнике, и теперь я продолжаю работать над своим приложением, и я нахожусь на модели «Художники», где каждый пользователь может создать нового исполнителя ex.Michael Hartl;) и добавить их самые популярные цитаты. Проблема заключается в том, чтобы позволить пользователям следить за своими любимыми художниками и видеть цитаты в фиде, точно так же, как микропоты из канала. Художник и Пользователь - это две разные модели, и рельсовый учебник не объясняет, как сделать для этого «систему следования». Это как каналы подписки на 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 

ответ

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 

Не забудьте создать миграцию для Artist и UserArtist. Таблица UserArtist должна содержать user_id и artist_id.

+0

Благодарим за ответ, но это не работает. Есть пара проблем с этим методом, и после целой недели работы я должен попробовать сделать это другим способом. – eglaza

+0

Что именно не работает и что вы пробовали? – Zippie

+0

Когда я нажимаю «Follow» на странице исполнителя, он снова загружает сайт и показывает мне кнопку «unfollow», поэтому я думаю, что теперь она работает. Когда я смотрю в базе данных (rails c), набрав '@user = User.first', а затем' @ user.artists', он показывает мне только '' => [] "'. Я много думал об этом, и я действительно не знаю, почему он не работает для меня. – eglaza

Смежные вопросы