Rails 3数组 - 添加带有类别的项目,然后列出类别中的项目

时间:2011-09-27 04:37:04

标签: arrays ruby-on-rails-3

作为我的Rails 3应用程序的一部分,我希望用户能够点击其他个人资料/页面上的链接,并将链接的字符串值添加到属于该用户个人资料的数组中。

具体来说,我要做的是为每个配置文件填充:todos的列表,具体取决于他们点击的todo。我们的想法是每个todo都属于以下两个类别之一:内部和外部。因此,单击链接会将todo的值推到内部或外部。然后,用户的个人资料将显示内部和外部的:todos列表,并计算该用户个人资料的todos总计。

因为我是编程的初学者,所以我在这里得到了一些关于设置它的帮助;但是我需要一些帮助来完成它。我似乎无法连接所有的点。我已经设置了一个连接模型但是无法添加todo的字符串值,然后在配置文件中列出/计算它。这是我的代码:

profile.rb型号:

class Profile < ActiveRecord::Base
  belongs_to :user
  accepts_nested_attributes_for :user

  has_many :profile_todos
  has_many :todos, :through => :profile_todos

  def add_todo_inside_item(item)
    self.profile_todos.build :category => 'inside'
  end

  def add_todo_outside_item(item)
    self.profile_todos.build :category => 'outside'
  end
end

todo.rb型号:

class Todo < ActiveRecord::Base
  belongs_to :profile
end

profile_todo.rb型号:

class ProfileTodo < ActiveRecord::Base
  belongs_to :profile
  belongs_to :todo
end

_create_todos.rb迁移:

class CreateTodos < ActiveRecord::Migration
  def self.up
    create_table :todos do |t|
      t.string :name

      t.timestamps
    end
  end

_create_profile_todos.rb迁移:

class CreateProfileTodos < ActiveRecord::Migration
  def self.up
    create_table :profile_todos do |t|
      t.string :category
      t.integer :profile_id

      t.timestamps
    end
  end

在用户个人资料中列出待办事项:

<div id="todos">
  <p><%= @profile.first_name %>&nbsp;has&nbsp;<%= pluralize(@profile.profile_todos.count, 'goal') %>.</p>
  <div id="todo-list">
    <div class="todos_inside">
      <p><%= @profile.profile_todos(:category => 'inside' %>.</p>
    </div>
    <div class="todos_outside">
      <p><%= @profile.profile_todos(:category => 'outside' %>.</p>
    </div>
  </div>
</div>

add_item到@ profile.todos:

<li><%= link_to "#", :class => 'button white' do %><%= @user.profile.stringtoadd %><% end %></li>

2 个答案:

答案 0 :(得分:1)

正如@socjopata所提到的,您将需要某种控制器action来管理ProfileTodo记录的创建和构建。由于您已经创建了ProfileTodo联接模型,因此请继续创建ProfileTodosController

有关控制器的更多信息: http://guides.rubyonrails.org/action_controller_overview.html

然后,您的link_to代码应远程调用create操作。为了使一切正常工作,您很可能需要为控制器提供profile_idtopic_id才能进行正确的RESTful事务,这意味着您必须提供您的link_to标记的参数哈希,如果您使用url_options,可能会变得有点混乱。

看看传递url_options: http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

最终,您正在创建一个新的ProfileTodo记录,因此如果您使用form_for标记隐藏了{{1}的字段,我认为这将更好地描述正在完成的工作}和profile_id。您还可以通过向其提供topic_id

来使表单远程显示在rails中

假设您制作了一个附带的控制器并将RESTful资源添加到:remote => true文件中,那么每个主题的表单将如下所示:

config/routes.rb

您可以随时设置表单样式,因此如果您只想显示链接,那应该是可行的:)

答案 1 :(得分:0)

您需要一个指向某个操作的远程链接,这样您就可以在不刷新页面的情况下操纵您的待办事项。来自文档:

  

:remote =&gt; true - 这将允许不显眼的JavaScript驱动程序   向有问题的URL发出Ajax请求,而不是关注   链接。每个驱动程序都提供了监听的机制   完成Ajax请求并执行JavaScript操作   一旦他们完成了

至于另一个问题,您可以定义用于显示和计算对象的范围:

http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html