Как добавить логику в представления?Рубин на рельсах - PullRequest
1 голос
/ 11 июня 2010

Сейчас я создаю приложение управления проектами в рельсах, вот некоторая справочная информация:

На данный момент у меня есть 2 модели, одна из которых является пользовательской, а другая - клиентской. Клиенты и пользователи имеют отношение один-к-одному (клиент -> has_one и пользователь -> own_to, что означает, что внешний ключ находится в таблице пользователей)

Итак, что я пытаюсь сделать, это когда вы добавляете клиента, вы можете фактически добавить учетные данные (добавить пользователя) к этому клиенту, для этого все клиенты отображаются со ссылкой рядом с именем этого клиента. Это означает, что вы действительно можете создать учетные данные для этого клиента.

То, что я не могу понять, как это сделать, это то, что, если у вас действительно есть учетные данные в базе данных (имеется в виду, что в таблице пользователей есть запись с вашим идентификатором клиента), то не отображайте эту ссылку. *

Вот то, что я думал, что будет работать

<% for client in @client%>
     <h5>
         <h4><%= client.id %></h4>
         <a href="/clients/<%= client.id %>"><%= client.name %></a>
          <% for user in @user %>
            <% if user.client_id = client.id %>
                <a href="/clients/<%= client.id %>/user/new">Credentials</a>
            <%end%>
          <% end %>
     </h5>
<% end %> 

А вот и контроллер:

def index
@client = Client.find_all_by_admin(0)
@user = User.find(:all)
end

но вместо этого он просто помещает ссылку количество раз на записи в пользовательской таблице. Любая помощь?

Ответы [ 3 ]

1 голос
/ 11 июня 2010

Просто чтобы добавить к ответу j., вам действительно следует использовать link_to view helper вместо жесткого кодирования URL.

1 голос
/ 11 июня 2010

Я когда-то не работал с Rails, но две вещи:

  1. Есть помощники, которые делают ваши URL, легко ошибаться. (Не то чтобы я видел один, а просто чтобы сообщить вам о них ...)
  2. В представлениях не должно быть логики. Столько, сколько вы можете убрать, поместите его в контроллер. Или даже лучше в модели.
  3. Хорошей практикой является не использовать "User.find: all", так как ваше приложение растет, это убьет вас.
  4. Лучше иметь метод в модели, который получает только ту информацию, которую вы будете использовать. Базы данных лучше в этом случае фильтровать.
1 голос
/ 11 июня 2010

Вы можете сделать следующее

# controller
def index
   @clients = Client.find_all_by_admin(0, :include => :user)
end

# view
<% @clients.each do |client| %>
   <h5>
      <h4><%= client.id %></h4>
      <%= link_to client.name, {:action => 'show', :id => client.id} %>

      <% if client.user.blank? %>
         <%= link_to "Credentials", 
            {:controller => 'user', :action => 'new', :client_id => client.id} %>
      <% end %>
   </h5>
<% end %> 

Редактировать

Лучшее решение: в контроллер попадают только клиенты, у которых еще нет пользователя:

# model
class Client < ActiveRecord::Base
   has_one :user

   named_scope :without_user,
      :conditions => "id NOT IN ( SELECT client_id FROM users )"
end

# controller 
@clients = Client.without_user.find_all_by_admin(0)

# view
<% @clients.each do |client| %>
   <h5>
      <h4><%= client.id %></h4>
      <%= link_to client.name, {:action => 'show', :id => client.id} %>
      <%= link_to "Credentials", 
            {:controller => 'user', :action => 'new', :client_id => client.id} %>
   </h5>
<% end %> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...