Has_many through и path helper - доступ к ресурсам через приложение - PullRequest
1 голос
/ 02 апреля 2012

У меня есть приложение, в котором пользователи могут следить за юридическими фирмами

у меня 3 модели - пользователь - Фирма - Следуйте

class Firm < ActiveRecord::Base
has_many :follows, :dependent => :destroy
has_many :users, :through => :follows

class User < ActiveRecord::Base
has_many :follows, :dependent => :destroy 
has_many :firms, :through => :follows

class Follow < ActiveRecord::Base
belongs_to :firm
belongs_to :user

В таблице в моем представлении индекса фирм я хотел бы взять текущую подпись и создать ассоциацию между этим пользователем и юридической фирмой через следующую таблицу.

По сути дела, это - firm.users << Пользователь (текущий) </p>

Это код, который у меня есть на данный момент, как бы вы предложили мне структурировать путь и соответствующий контроллер?

<% @firms.each do |firm| %>
  <tr id = "firm_<%= firm.id %>">
    <td><%= link_to image_tag(firm.logo_url, :size => "80x120"), firm.url %></td>
    <td><%= link_to firm.name, firm_path(firm) %></td>  
    <% if user_signed_in? %><td>
    <%= button_to 'Follow',  ? , method: :post %>
    </td>
    <% end %>

Я использую devise для аутентификации пользователя и включил следующие помощники в помощник приложения, чтобы позволить моему частичному входу в систему функционировать в представлении других моделей.

  def resource_name
:user
end

def resource_id
 :user_id
end

def resource
@resource ||= User.new
end

1 Ответ

0 голосов
/ 02 апреля 2012

Самый простой способ - это действие follow на FirmsController.

В config/routes.rb:

resources :firms do
  post :follow, on: :member
end

В вашем FirmsController:

def follow
  @firm.users << current_user
end

На ваш взгляд:

<%= link_to "Follow", follow_firm_path(@firm), method: :post %>

Другим способом было бы представить следующие отношения в качестве единственного ресурса. Вы будете следовать за фирмой POST до /firms/1234/follow, и вы откажетесь от фирмы, отправив запрос DELETE на /firms/1234/follow.

Если вы хотите использовать этот подход, вы должны вставить это в свой config/routes.rb:

resources :firms do
  resource :follow, on: :member
end

И вы бы создали FollowsController вот так:

class FollowsController < ApplicationController
  def create
    @firm = Firm.find params[:firm_id]
    @firm.users << current_user
    # respond with success
  end

  def destroy
    @firm = Firm.find params[:firm_id]
    @firm.users.delete current_user
    # respond with success
  end
end
...