模式来呈现多个咖啡

时间:2016-12-20 14:50:44

标签: javascript ruby-on-rails ruby-on-rails-4 coffeescript

我有一个与taskuser模型相关的project模型。

当我创建/更新任务时,我需要在视图异步中进行更新,不仅用于任务更改/添加,还包括项目和用户信息(因为某些数据可能也会更改)。 / p>

我在控制器中有这个:

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 }) %>")

它很棒。我看到了两个问题:

  • 在我添加的.js.coffee的每个渲染中,我都在重复代码。我复制完全相同的代码用于更新项目和用户数据,任务更新,任务销毁,我会对可能影响用户和项目的新模型执行相同操作

  • 处理tasks / create.js.coffee中的项目和用户数据似乎很奇怪

因此,我正在寻找一个更好的模式来处理这些东西,任何想法?

编辑(澄清): 我认为实现这样的目标会更好:

任务/ create.js.coffee

# Update task table
$('#mytable').append("<%= j render(partial: 'tasks/task', locals: { t: @task }) %>")

UserData.refresh()
ProjectData.refresh()

但是,我无法做到这一点,因为我每次都需要渲染局部,所以我必须做一些奇怪的事情,比如将html部分传递给那些refresh()函数,它会很漂亮与以前的方式相同。 这只是我想到的一种方式,但我想听听你的想法。

2 个答案:

答案 0 :(得分:1)

您可以渲染属于不同控制器的模板/操作。因此,您可以保留tasks / create.js.coffee文件以及使用相同代码的所有其他控制器操作(如用户和项目),在您的respond_to块中使用:

format.json { render 'tasks/create' }

您甚至可以呈现特定文件:

format.json { render file: "path/to/specific/file" }

这是一个链接,其中包含有关在rails中呈现的更多信息:http://guides.rubyonrails.org/layouts_and_rendering.html#rendering-an-action-s-template-from-another-controller

答案 1 :(得分:0)

对于可能对此问题的答案感兴趣的任何人,我发现 Garber-Irish模式是我问题的一个很好的解决方案。

您可以在此处详细了解: https://www.viget.com/articles/extending-paul-irishs-comprehensive-dom-ready-execution

甚至还有一颗宝石:https://github.com/tonytonyjan/gistyle

使用此模式,您可以拥有HTTP请求的执行上下文。因此,例如,您可以在每个js控制器上使用afterCreate()方法,并根据创建HTTP请求的位置,您可以触发不同的事件。

这允许使用多态答案来更新视图。