Почему link_to при частичном использовании возвращает ссылку на родительский объект, а не на фактический объект?

Итак, у меня есть две модели: пользователи, которые принадлежат организации (у которой есть много пользователей). Я использую частичное отображение всех пользователей, принадлежащих к какой-либо конкретной организации, и это работает нормально, если я выводю только имя (оно правильно называет всех пользователей). Однако, когда я изменяю частичный код для предоставления link_to user.name, все возвращаемые ссылки являются ссылками на родительскую организацию, а не на отдельные дочерние объекты. Что я делаю неправильно?

Соответствующий код:

Контроллер организаций

def show
@organization = Organization.find(params[:id])
@users_index = User.joins(:organization).where(organizations: {id: @organization.id})
end

Organization.show.html.erb

<% provide(:title, @organization.organization_name) %>
<h1><%= @organization.organization_name %></h1>
<h2>Your Organization's Users:</h2>
<%= render partial: "users_index", collection: @users_index %>

_users_index.html.erb код:

<p class="users"><%= link_to users_index.name %></p>

person Zoinks10    schedule 27.07.2014    source источник


Ответы (2)


link_to

Я думаю, что суть проблемы, о которой говорится в другом ответе, - это ваш link_to:

<%= link_to users_index.name %>

Вспомогательный метод link_to в основном работает следующим образом:

<%= link_to "Your Link Text", link_path %>

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

Я предполагаю, что ваша отображаемая ссылка будет указывать на «#», а не на «родительский объект», как вы упомянули.

--

Исправить

Я бы сделал это:

#app/views/organization/show.html.erb
<%= render partial: "users_index", collection: @users_index, as: :user %>

#app/views/organization/_users_index.html.erb
<p class="users"><%= link_to user.name, user %></p>

Это должно установить для вас правильный link_to вспомогательный метод

--

Модели

Кроме того, я бы также обратился к associations в ваших моделях.

В настоящее время вы звоните users самым неэффективным способом. Ассоциации ActiveRecord помогают исправить это:

#app/models/user.rb
Class User < ActiveRecord::Base
   belongs_to :organization
end

#app/models/organization.rb
Class Organization < ActiveRecord::Base
   has_many :users
end

Это позволит вам вызвать следующее:

#app/controllers/organizations_controller.rb
Class OrganizationsController < ApplicationController
   def show
      @organization = Organization.find params[:id]
      @users_index = @organization.users
   end
end
person Richard Peck    schedule 27.07.2014
comment
Отлично - это сработало именно так, как я надеялся. Спасибо большое за вашу помощь. - person Zoinks10; 27.07.2014
comment
Спасибо, Рич. Я использовал более громоздкий код, потому что он мне понадобился в другой части проекта (чтобы здесь были показаны только пользователи текущей организации). Это обновление тоже работает, спасибо за вашу помощь. - person Zoinks10; 27.07.2014
comment
Нет проблем - рад, что помог - person Richard Peck; 27.07.2014

Если вы правильно настроите свои отношения, вы можете использовать:

@users_index = @organization.users

А затем вам нужно пройти через @users_index и передать его вашему партиалу.

@users_index.each do |user|
    <%= render "users_index", :user => user %>
end

И в вашем частичном случае измените на:

<p class="users"><%= link_to user.name, user %></p>
person AytanLeibowitz    schedule 27.07.2014
comment
Спасибо за ответ. Где мне установить код @ users_index = @ organization.users? В контроллере пользователей? Я использую запрос ActiveRecord, потому что хочу получить только пользователей, принадлежащих к текущей / активной организации. Когда я пробовал ваш код, он выдает ошибку о том, что в моем случае для класса (который является организацией, определяемой ее первичным ключом) не определен пользователь метода. - person Zoinks10; 27.07.2014