【问题标题】:How add logic to Views? Ruby on Rails如何为视图添加逻辑? Ruby on Rails
【发布时间】:2010-06-11 16:12:47
【问题描述】:

现在我正在 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

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

【问题讨论】:

  • 您确定问题不只是因为您使用的是赋值 '=' 而不是测试相等性 '==' 吗? if user.client_id == client.id 而不是 if user.client_id = client.id
  • 现在我正在努力解决另一个问题......我目前正在添加凭据,但实际上并未进入控制器的“显示”方法,而是使用将 client_id 传递给用户以这种方式建模: 'user', :action => 'new', :client_id => client.id} %> 将所有内容添加到用户控制器的正确方法是什么?如果我使用 @user = User.new(:user) 它不会加载 client_id,如果我使用 @user = User.new(:client_id => params[:client]) 也不会加载它。跨度>
  • 你应该像这样创建用户:User.new(:client_id =&gt; params[:client_id])
  • 你确定你使用的是params[:client_id]吗?因为你之前发过params[:client]
  • 是的,这是我的控制器: def create @user = User.new(:client_id => params[:client_id]) if @user.save flash[:notice] = "Credentials created" else flash [:error] = "凭据创建失败" end end

标签: ruby-on-rails ruby view controller erb


【解决方案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 %> 

【讨论】:

  • 非常感谢!第一个选项是正确的答案,因为我需要显示所有客户端,我不想总是显示链接。感谢快速准确的回答。
  • 你介意看看我的回答下面的评论吗?我现在正在为此苦苦挣扎 =(
【解决方案2】:

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

【讨论】:

  • 谢谢!从现在开始会做。
【解决方案3】:

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

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

【讨论】:

  • 感谢您的点击!我真的很感激这种 cmets,他们让我提高了我的滑轨技能! :)
猜你喜欢
  • 1970-01-01
  • 2017-03-25
  • 2011-12-03
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多