Rails 允许用户设置默认值
Rails allow user to set default
我正在使用一个允许用户创建项目的 Rails 应用程序。在这些项目中,用户可以制作清单。我正在尝试弄清楚如何让用户从项目索引页面中选择他们的 "Default Working Project"。然后这将在整个应用程序中传播,仅显示与当前项目关联的列表。制作这样的东西的最佳方法是什么。
在 Users
table 中用 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
您可以通过向用户 table 添加 default_working_project_id
字段轻松实现此目的。
然后在你的控制器索引中设置:
@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)
已更新
要删除用户的当前默认项目 ID:
您可以通过一些方法来实现这一点,例如:
在您的项目模型中
如果你有那个项目 belongs_to 用户的关系,试试这个。
def is_a_current_project?
self.id == self.user.default_working_project_id
end
然后创建一个 after_destroy :remove_current_project_relation
回调方法。
还有方法,我建议将其添加到您的私有方法中:
def remove_current_project_relation
if is_a_current_project?
self.user.default_working_project = nil
end
end
如果只有一个用户可以看到他的项目,其他用户将看不到其他用户的项目,我的建议是:
在projects
table中做一个布尔值is_default
。通过迁移添加它。
在控制器中将:is_default
添加到def project_params
。
在项目索引页中使用:
<%= render @projects %>
在 views/projects
文件夹中创建文件 _project.html.erb
,向其中添加:
<%= 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
在 assets/javascripts
文件夹中的 projects.coffee
中:
$('input.project_default').change -> $(this).closest('form').submit()
在views/projects
文件夹中创建update.js.erb
,向其中添加:
$('#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
。
我正在使用一个允许用户创建项目的 Rails 应用程序。在这些项目中,用户可以制作清单。我正在尝试弄清楚如何让用户从项目索引页面中选择他们的 "Default Working Project"。然后这将在整个应用程序中传播,仅显示与当前项目关联的列表。制作这样的东西的最佳方法是什么。
在 Users
table 中用 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
您可以通过向用户 table 添加 default_working_project_id
字段轻松实现此目的。
然后在你的控制器索引中设置:
@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)
已更新
要删除用户的当前默认项目 ID:
您可以通过一些方法来实现这一点,例如:
在您的项目模型中
如果你有那个项目 belongs_to 用户的关系,试试这个。
def is_a_current_project?
self.id == self.user.default_working_project_id
end
然后创建一个 after_destroy :remove_current_project_relation
回调方法。
还有方法,我建议将其添加到您的私有方法中:
def remove_current_project_relation
if is_a_current_project?
self.user.default_working_project = nil
end
end
如果只有一个用户可以看到他的项目,其他用户将看不到其他用户的项目,我的建议是:
在
projects
table中做一个布尔值is_default
。通过迁移添加它。在控制器中将
:is_default
添加到def project_params
。在项目索引页中使用:
<%= render @projects %>
在
views/projects
文件夹中创建文件_project.html.erb
,向其中添加:<%= 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
在
assets/javascripts
文件夹中的projects.coffee
中:$('input.project_default').change -> $(this).closest('form').submit()
在
views/projects
文件夹中创建update.js.erb
,向其中添加:$('#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
。