1

现在我正在 Rails 中构建一个项目管理应用程序,这里有一些背景信息:

现在我有2个模型,一个是用户,另一个是客户端。Clients 和 Users 是一对一的关系(client -> has_one 和 user -> belongs_to 这意味着它在 users 表中的外键)

所以我想要做的是,一旦您添加了一个客户端,您实际上可以向该客户端添加凭据(添加用户),为此,所有客户端都显示在该客户端名称旁边的链接,这意味着您实际上可以为该客户端创建凭据。

我不知道该怎么做,如果您实际上在数据库中有凭据(这意味着用户表中有一条带有您的客户端 ID 的记录),则不要显示该链接。

这就是我认为可行的方法

<% 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

但它只是将链接放在用户表中每条记录的次数。有什么帮助吗?

4

3 回答 3

1

我有一段时间没有使用过 Rails,但有两件事:

  1. 有帮手制作你的网址,很容易出错。(不是我看到一个,只是为了让你知道他们......)
  2. 视图不应该有逻辑。尽可能多地把它放在控制器中。甚至在模型中更好。
  3. 最好不要使用“User.find :all”,随着您的应用程序的增长,这会杀死您。
  4. 最好在模型中有一个方法来获取您将使用的信息。在这种情况下,数据库更好地过滤。
于 2010-06-11T16:33:24.663 回答
1

您可以执行以下操作

# 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 %> 
于 2010-06-11T16:25:41.160 回答
1

只是为了添加 j. 的答案,您确实应该使用link_to视图助手而不是硬编码 URL。

于 2010-06-11T16:30:07.673 回答