Rails 5.0 - 如何在不使用best_in_place gem的情况下实现就地编辑

时间:2017-05-17 14:14:28

标签: ruby-on-rails ruby ajax model-view-controller

我正在使用RoR构建一个Events网站,我刚刚将其升级到v5.0.1(尚未转移到5.1)。我的事件显示页面在页面底部有一个评论部分,到目前为止,它只有一个创建和删除功能。 我想在评论中添加编辑/更新功能,因此只有创建评论的用户才能在他们认为合适的情况下编辑评论。我希望他们能够在同一页面上编辑他们的评论。

我正在尝试使用remote实现这些更改:true& Ajax,而不是依赖于宝石,因为它看起来并不太复杂,但我以前从未这样做过,并且似乎没有通过互联网/ SO的明确指南。这是我的观点&控制器代码 -

comments_controller.rb

    def create
        @event = Event.find(params[:event_id])
        @comment = @event.comments.create!(params[:comment].permit(:name, :body))
        @comment.user_id = current_user.id


        redirect_to @event
    end

    def update
        @comment.user = current_user

    respond_to do |format|
      if @comment.update
        format.html { redirect_to @comment, notice: 'Comment was successfully updated.' }
        format.js   { }
        format.json { render :show, status: :created, location: @comment }
      else
        format.html { render :new }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
      end
    end
  end



    def destroy
        @event = Event.find(params[:event_id])
        @comment = @event.comments.find(params[:id])
        @comment.destroy

        redirect_to event_path(@event)
    end

_comments.html.erb

<% if user_signed_in?  %>
  <p><%= link_to "Edit", remote: true %></p>
  <p><%= link_to 'Delete', [comment.event, comment],
                  method: :delete,
                  class: "button",
                  data: { confirm: 'Are you sure?' } %></p>
  <% end %>

我的理解是我需要在我的views / comments文件夹中包含一个.js.erb文件来处理这个(edit.js.erb?)但是我不清楚的是我需要的javascript代码包含以使其工作。另外,我认为上面的控制器代码看起来不正确 - 这应该在编辑动作中吗?我是否还需要在事件控制器中使用Event#show action,因为它位于视图中?

非常感谢任何协助。

2 个答案:

答案 0 :(得分:4)

我意识到这并没有回答你的问题,但希望它能为你解决头痛问题,就像重新发明轮子一样。这也是为什么(我相信)你看到了downvotes。

  

我不想使用best_in_place gem,因为它似乎暂时没有更新,我不确定它是否最适合Rails 5.0。

宝石不需要让活动仍然有用。通过“一段时间”,你必须意味着“不到24小时前”,因为我在上个月看到了很多活动。一旦宝石解决了它通常很好的去。

https://github.com/bernat/best_in_place/commits/master

Rails 5仍处理POST请求吗?然后它应该工作。 best_in_place比任何东西都更重要。 https://github.com/bernat/best_in_place/tree/master/lib/best_in_place

其中最“令人生畏”的代码是helper.rb文件,该文件呈现挂钩到JS库的HTML。

更新

comments / edit.js.erb文件负责插入表单以编辑评论,例如$('div#new_comment').append('<%= j render 'form' %>');

这假设您在元素/ ID命名方面使用Rails的约定。

如果您有link_to("Edit", edit_comment_path(comment), :remote => true),则应自动触发所有内容。

Here's an example repo using Rails 4;对于Rails 5应该是相同的,但(可能)respond_to块除外?我不确定,还没有使用过Rails 5。只需bundlerake db:setup,然后rails s;导航至http://localhost:3000/events并享受。

答案 1 :(得分:0)

你使用edit.js.erb走在正确的轨道上。该文件应该包含用于设置编辑屏幕的JS代码,例如,可能隐藏DIV并显示INPUT或TEXTAREA。

当然,该文件也可以包含Ruby代码,在&lt; %%&gt;内。标签