Rails更新模型而不离开页面

时间:2013-08-06 08:20:37

标签: javascript jquery ruby-on-rails ruby ajax

在不离开页面的情况下更新记录并显示Flash成功通知的最佳方法是什么?

以下是我的代码的一部分,但它重定向回根路径:

查看

      <%= form_for @user, url: record_testimonial_path(@user) do |f| %>  
        <%= f.text_area :testimonial %>
        <%= f.submit "Submit"%>
      <% end %>

控制器

def record_testimonial
  @user.update_attribute(:testimonial, params[:user][:testimonial])
  flash[:success] = "Thank you!"
  redirect_to root_path
end

2 个答案:

答案 0 :(得分:2)

您可以重定向回来:

redirect_to :back, flash: { success: t('flash.thank_you') }

或者您必须通过远程执行此操作:

<%= form_for @user, url: record_testimonial_path(@user), remote: true do |f| %>  
  <%= f.text_area :testimonial %>
  <%= f.submit "Submit"%>
<% end %>

在控制器中:

def record_testimonial
  if @user.update_attribute(:testimonial, params[:user][:testimonial])
    respond_to do |format|
      format.js { render 'record_testimonial', layout: false }
    end
  else
    render nothing: true # This will silently fail. Probably not intended.
  end      
end

然后是record_testimonial.js.erb:

$('#some_id').html('<%= j render "some_partial", user: @user %>');

这些是最常见的,我会说明智的方法。如果你使用ajax不要忘记手动显示flash消息,应该是1行JS。

答案 1 :(得分:0)

完全避免页面刷新的最佳方法是将表单设置为像这样使用:remote => true

<%= form_for @user, url: record_testimonial_path(@user), :remote => true do |f| %> 

然后在控制器中做出相应的响应:

def record_testimonial
  respond_to do |format|
    if @user.update_attribute(:testimonial, params[:user][:testimonial])
      render :success
    else
      render :error
    end
  end
end

此处需要successerror的相应模板,用于处理成功或错误消息的显示。

有关详细信息,请查看here