我正在使用允许用户创建项目的Rails应用程序。在这些项目中,用户可以制作列表。我想弄清楚如何让用户选择他们的"默认工作项目"来自项目索引页面。然后,这将在整个应用程序中传播,仅显示与当前项目关联的列表。制作这样的东西的最佳方法是什么。
答案 0 :(得分:2)
在Users
表格中使用default_project_id
创建数据库字段并进行设置。
在模型集上:
def default_project
return projects.find_by_id(default_project_id) if default_project_id
false
end
然后,你可以使用这样的东西:
lists = user.default_project ? user.default_project.lists : user.lists
答案 1 :(得分:2)
您可以通过向用户表中添加@default_working_project = current_user.default_working_project
字段来轻松实现此目的。
然后在您的控制器索引集中:
belongs_to :default_working_project, class_name: Project, foreign_key: :default_working_project_id
在您的用户模型中添加:
resources :projects do
member do
get 'set_default'
end
end
您可以创建自己的操作。在您的路线文件中:
projects_controller
在def set_default
project.find params[:id]
current_user.default_working_project_id = project.id
respond_to do |format|
if current_user.save
format.html { redirect_to projects_path }
else
format.html { render 'index', notice: "your error message" }
end
end
end
:
link_to 'set default', set_default_project_path(project.id)
在你的观点中添加
def is_a_current_project?
self.id == self.user.default_working_project_id
end
<强>已更新强>
从用户中删除当前默认项目ID:
您可以制定一些方法来实现这一目标,例如:
在您的项目模型中
如果你有项目所属的关系,那么用户试试这个。
after_destroy :remove_current_project_relation
然后创建一个def remove_current_project_relation
if is_a_current_project?
self.user.default_working_project = nil
end
end
回调方法。
方法,我建议将其添加到您的私有方法中:
void do_thing(std::vector<some_class*> some_class_vector)
{
size_t items_to_process = some_class_vector.size();
for (i = 0; i < items_to_process; i++)
{
some_class_vector[i]->compute();
}
}
答案 2 :(得分:1)
如果只有一个用户可以看到他的项目,而其他用户将无法看到其他用户的项目,我的建议是:
在is_default
表格中设置一个布尔值projects
。添加迁移。
将:is_default
添加到控制器中的def project_params
。
在项目索引页面中使用:
<%= render @projects %>
在_project.html.erb
文件夹中创建文件views/projects
,添加到其中:
<%= form_for project, remote: true do |f| %>
# some project data
<%= f.check_box :is_default, class: 'project_default' %>
<% end %>
在projects_controller
:
def update
@project = Project.find(params[:id])
if @project.update_attributes(project_params)
respond_to do |format|
format.html { redirect_to project_page } # this will run when you update project from edit page in form without 'remote: true'
format.js # this will run if you update project with 'remote: true' form
end
end
end
projects.coffee
文件夹中的assets/javascripts
:
$('input.project_default').change -> $(this).closest('form').submit()
在update.js.erb
文件夹中创建views/projects
,添加到其中:
$('#edit_project_<%= @project.id %>').replaceWith("<%= j render 'project' %>");
在projects_helper
def current_project
current_user.projects.find_by(is_default: true)
end
也许你需要根据你的任务改变这些。此解决方案将通过JavaScript更新项目。
此外,在Project
模型中添加一个方法会很棒,当用户将其他项目设为默认值时,这将使之前的默认项目不是默认项目。
当您需要使用默认项目中的列表时,您可以在视图中使用default_project.lists
。