Ruby on rails Rails允许用户设置默认值
我正在使用一个允许用户创建项目的Rails应用程序。在这些项目中,用户可以创建列表。我试图弄清楚如何允许用户从项目索引页面选择他们的“默认工作项目”。这将在整个应用程序中传播,只显示与当前项目关联的列表。制作这样的内容的最佳方法是什么。在Ruby on rails Rails允许用户设置默认值,ruby-on-rails,ruby,default,Ruby On Rails,Ruby,Default,我正在使用一个允许用户创建项目的Rails应用程序。在这些项目中,用户可以创建列表。我试图弄清楚如何允许用户从项目索引页面选择他们的“默认工作项目”。这将在整个应用程序中传播,只显示与当前项目关联的列表。制作这样的内容的最佳方法是什么。在用户表中使用默认项目id创建一个数据库字段并进行设置 在模型集上: def default_project return projects.find_by_id(default_project_id) if default_project_id fa
用户
表中使用默认项目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
使用
default\u project\u id
在Users
表中创建一个数据库字段并进行设置
在模型集上:
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
通过将
default\u working\u project\u 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
在您的项目\u控制器中
:
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
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
在您的视图中,只需添加
link_to 'set default', set_default_project_path(project.id)
已更新
要从用户中删除当前默认项目id,请执行以下操作:
您可以使用一些方法来实现这一点,例如:
在项目模型中
如果项目属于用户,请尝试此操作
def is_a_current_project?
self.id == self.user.default_working_project_id
end
然后在销毁后创建一个:删除当前项目关系回调方法
对于方法,我建议将其添加到您的私有方法中:
def remove_current_project_relation
if is_a_current_project?
self.user.default_working_project = nil
end
end
通过将default\u working\u project\u 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
在您的项目\u控制器中
:
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
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
在您的视图中,只需添加
link_to 'set default', set_default_project_path(project.id)
已更新
要从用户中删除当前默认项目id,请执行以下操作:
您可以使用一些方法来实现这一点,例如:
在项目模型中
如果项目属于用户,请尝试此操作
def is_a_current_project?
self.id == self.user.default_working_project_id
end
然后在销毁后创建一个:删除当前项目关系回调方法
对于方法,我建议将其添加到您的私有方法中:
def remove_current_project_relation
if is_a_current_project?
self.user.default_working_project = nil
end
end
如果只有一个用户可以看到他的项目,而其他用户无法看到其他用户的项目,我的建议是:
在projects
表中,默认设置一个布尔值。将其添加到迁移中
添加:是控制器中的def project\u参数的默认值
在“项目索引”页面中,使用:
<%= render @projects %>
在项目\u控制器中
:
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
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()
在views/projects
文件夹中创建update.js.erb
,添加到其中:
<%= form_for project, remote: true do |f| %>
# some project data
<%= f.check_box :is_default, class: 'project_default' %>
<% end %>
$('#edit_project_<%= @project.id %>').replaceWith("<%= j render 'project' %>");
也许您需要根据您的任务对这些进行一些更改。此解决方案将通过JavaScript更新项目
另外,最好在项目
模型中添加一个方法,当用户将其他项目设置为默认项目时,该方法将使以前的默认项目不默认,以此类推
当您需要使用默认项目中的列表时,可以在视图中使用default\u project.lists
。如果只有一个用户可以看到他的项目,而其他用户无法看到其他用户的项目,我的建议是:
在projects
表中,默认设置一个布尔值。将其添加到迁移中
添加:是控制器中的def project\u参数的默认值
在“项目索引”页面中,使用:
<%= render @projects %>
在项目\u控制器中
:
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
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()
在views/projects
文件夹中创建update.js.erb
,添加到其中:
<%= form_for project, remote: true do |f| %>
# some project data
<%= f.check_box :is_default, class: 'project_default' %>
<% end %>
$('#edit_project_<%= @project.id %>').replaceWith("<%= j render 'project' %>");
也许您需要根据您的任务对这些进行一些更改。此解决方案将通过JavaScript更新项目
另外,最好在项目
模型中添加一个方法,当用户将其他项目设置为默认项目时,该方法将使以前的默认项目不默认,以此类推
当您需要使用默认项目中的列表时,您可以在视图中使用default\u project.lists
。很抱歉,我不清楚需要放置default\u project
的模型以及放置lists=user.default\u项目的位置?user.default\u project.lists:user.lists
行。很抱歉,我不清楚需要放置哪个型号的default\u项目
,以及将lists=user.default\u项目放置在哪里?user.default_project.lists:user.lists
行。我尝试运行服务器时出错。我相信它来自协会:默认的工作项目。您是否可以确认这是正确的,或者我是否应该与我的项目模型建立关联?您是否已经在users表上创建了列?您不需要通过这样做在项目上设置关系。请尝试删除模型关联上的foreing_key::default_working_project_id。foreign_key拼写错误!啊!!!是的,我掉进了复制粘贴的洞。。。它现在似乎正在工作,但是如何调用它,以便我可以使用按钮设置默认值?我有一个表列出了项目,每个项目旁边都有一个“设置默认值”按钮。当我试图运行服务器时,我遇到了一个错误。我相信它来自协会:默认的工作项目。您是否可以确认这是正确的,或者我是否应该与我的项目模型建立关联?您是否已经在users表上创建了列?您不需要通过这样做在项目上设置关系。请尝试删除模型关联上的foreing_key::default_working_project_id。foreign_key拼写错误!啊!!!是的,我掉进了复制粘贴的洞。。。好像是w