5

只是一个简单的问题,我已经关注了railscast

远程真正的工作方式很好,但我如何验证模型?

我有这个

<%= form_for [:admin,@course], remote: true  do |f| %>
  <div class="field">
    <%= f.label :title, "The title:" %><br />
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :description, "Descripcion:" %><br />
    <%= f.text_area :description %>
 </div>
 <div class="actions">
   <%= f.submit "Send"%>
 </div>
<% end %>

我如何处理错误?

def create

  @course = Course.new(params[:course])

  respond_to do |format|
    if @course.save
      format.html { redirect_to admin_index_url, :notice=> 'Done !!' }
      format.js
    else
      format.html { flash.now[:alert] = "Not done" 
                    render "new"
                  }
      format.js
    end
  end        
end

任何想法为什么这不起作用?

4

3 回答 3

6

由于您的 format.js 块是空的,并且创建操作是通过 :remote=>true 调用的,因此 rails 将执行默认操作,即查找 create.js.erb 以返回,它可能找不到。

为了说明,把它放在 app/views/?/create.js.erb 的 views 目录中:

alert('HI');

然后将其放入您的控制器中以查看替代方法:

respond_to do |format|
  if @course.save
    format.html { redirect_to admin_index_url, :notice=> 'Done !!' }
    format.js { render :js=>'alert("done");' }
  else
    format.html { flash.now[:alert] = "Not done" 
                render "new"
                }
    format.js { render :js=>'alert("not done");' }
  end
end        

所以现在,您只需将错误消息放入发送回的 HTML/Javascript 中,可能最简单的方法是将其放入适当的 .js.erb 文件中。

于 2012-11-06T00:12:28.963 回答
2

您必须在模型中定义验证器。

 class Course 
    validates :title, :presence => true
 end

在您的控制器中,您尝试使用 @course.save 保存实例。如果它没有保存,您可以通过调用返回错误

    @course.errors.full_messages 

一旦你掌握了这些错误,你就传递给视图并向用户显示一条消息。不记得究竟如何使用 format js 来做到这一点。

编辑 2 ======== 检查此链接:http ://www.alfajango.com/blog/rails-3-remote-links-and-forms/ 试试这个

    respond_to do |format|
       if @course.save
          format.html { redirect_to admin_index_url, :notice=> 'Done !!' }
          format.js { render :js=>'alert("done");' }
       else
         render :json => @comment.errors, :status => :unprocessable_entity
       end
    end  


 In your javascript, bind the error callback and get the errors you passed in your controller.


 $(document).ready(function(){

$('#form_name').bind("ajax:error", function(evt, xhr, status, error){
  var $form = $(this),
      errors,
      errorText;

  try {
    // Populate errorText with the comment errors
    errors = $.parseJSON(xhr.responseText);
  } catch(err) {
    // If the responseText is not valid JSON (like if a 500 exception was thrown), populate errors with a generic error message.
    errors = {message: "Please reload the page and try again"};
  }

  // Build an unordered list from the list of errors
  errorText = "There were errors with the submission: \n<ul>";

  for ( error in errors ) {
    errorText += "<li>" + error + ': ' + errors[error] + "</li> ";
  }

  errorText += "</ul>";

  // Insert error list into form
  $form.find('div.validation-error').html(errorText);
});

});
于 2012-11-06T00:04:13.727 回答
1

为此,我开发了 jquery 插件。可能值得一看。

https://github.com/bighostkim/remoteValidation

于 2013-02-05T22:08:46.007 回答