2010-06-11 69 views
1

现在我在rails中构建一个项目管理应用程序,下面是一些背景信息:如何将逻辑添加到视图? Ruby on Rails

现在我有2个模型,一个是User,另一个是Client。客户和用户有一个一对一的关系(客户端 - > HAS_ONE和用户 - > belongs_to的,这意味着外键它在用户表)

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

我不知道该怎么办,如果你真的在数据库中有证书(这意味着在你的客户端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 

而是它只是把该链接的数量乘以每个记录在user表中。任何帮助?

+0

你确定问题不仅仅是你使用赋值'='而不是测试相等'=='吗? if user.client_id == client.id而不是if user.client_id = client.id – 2010-06-11 18:52:59

+0

现在我正在努力处理另一个问题......我目前添加的凭证没有真正进入“show”方法而是使用以下方式将client_id传递给用户模型: <%= link_to“凭证”, {:controller =>'user',:action =>'new',:client_id => client.id}%> 将所有内容添加到用户控制器的正确方法是什么? 如果我使用@user = User.new(:user)它将不会加载client_id ,如果我使用@user = User.new(:client_id => params [:client])将不会加载它。 – Gotjosh 2010-06-11 19:14:17

+0

你应该像这样创建用户:'User.new(:client_id => params [:client_id])' – 2010-06-11 20:07:47

回答

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

非常感谢!第一个选项是正确答案,因为我需要显示所有的客户端,我不想总显示的是链接。欣赏快速准确的答案。 – Gotjosh 2010-06-11 18:31:12

+0

我很高兴我可以帮忙:] – 2010-06-11 20:03:09

+0

你介意看看我的答案下面的评论? ( – Gotjosh 2010-06-11 20:03:58

1

刚添加到j。的答案,你真的应该使用link_to视图助手,而不是硬编码的URL。

+0

谢谢!现在就做, – Gotjosh 2010-06-11 18:08:50

1

我还没有在某个时候使用Rails的工作,但两件事情:

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

感谢您的支持!我真的很感谢他们让我提高了我的铁轨技巧!:) – Gotjosh 2010-06-11 18:08:02