【发布时间】:2017-05-05 19:58:26
【问题描述】:
我有一个与user 和project 模型相关的task 模型。
当我创建/更新任务时,我需要在视图中进行异步更新,不仅针对任务更改/添加,还针对项目和用户信息(因为其中一些数据也可能发生更改)。
我在控制器中有这个:
def create
@task = Task.new(params[:task])
@project = Project.find(params[:project_id])
respond_to do |format|
if @task.save
format.html { redirect_to @task, notice: 'Task was successfully created.' }
format.json { render json: @task, status: :created, location: @task }
else
format.html { render action: "new" }
format.json { render json: @task.errors, status: :unprocessable_entity }
end
end
end
还有我的任务/create.js.coffee
# Update task table
$('#mytable').append("<%= j render(partial: 'tasks/task', locals: { t: @task }) %>")
# Update user data
$('.user-data').html("<%= j render(partial: 'users/user_widget', locals: { u: current_user }) %>")
# Update project data
$('.project-data').html("<%= j render(partial: 'projects/project_widget', locals: { p: @project }) %>")
而且效果很好。我看到 2 个问题:
在我添加的
.js.coffee的每次渲染中,我重复代码太多了。我复制完全相同的代码来更新项目和用户数据,在任务更新、任务销毁时,我会为可能影响用户和项目的新模型做同样的事情在 tasks/create.js.coffee 中处理项目和用户数据似乎很奇怪
因此,我正在寻找一种更好的模式来处理这些东西,有什么想法吗?
编辑(澄清): 我认为实现这样的目标会更好:
tasks/create.js.coffee
# Update task table
$('#mytable').append("<%= j render(partial: 'tasks/task', locals: { t: @task }) %>")
UserData.refresh()
ProjectData.refresh()
但是,我不能这样做,因为我每次都需要渲染部分,所以我必须做一些奇怪的事情,比如将 html 部分传递给那些 refresh() 函数,它与以前的方式。
这只是我想到的一种方式,但如果有的话,我想听听你的想法。
【问题讨论】:
-
我不清楚你在问什么。你想避免什么?
-
我试图避免我在帖子中描述的这两个问题:不重复代码来更新与项目和用户相关的模型的每个咖啡中的项目和用户数据。并且没有在任务 js 中更新用户和项目的责任。虽然这些问题非常相关
-
@DaveNewton 看看我的编辑,它可能会澄清一些事情
标签: javascript ruby-on-rails ruby-on-rails-4 coffeescript