如何将控制器中的json响应传递给rails中的ajax调用

时间:2014-03-03 14:16:17

标签: jquery ruby-on-rails ajax

这是我在js文件中的ajax调用部分:

$("#sign_submit").click(function(){
            email_id = $("#user_email").val();
            password = $("#user_password").val();

            data =  {email: email_id, password: password };
            url = user/sign_in';

            $.ajax({
                url: url,
                data:  data,
                cache: false,
                type: "post",
                success: function(data){
                    console.log(data);
                }
              });
});

这是我的控制器动作:

  def create
    @user = User.find_by_email(params['email'])
    if @user.nil?
      respond_to do |format|
        format.json {render :json => {:response => 'User is invalid'} }     #how to pass json response here. 
      end
    end

    if @user.check_valid_user?(params['password'])
      set_dashboard_location
      set_current_user(session[:customer_id])
      render js: %(window.location.href='#{session["spree_user_return_to"]}')
    else
       #redirect_to '/' and return 
       #how to psas json response here.
    end
  end

在创建动作(其他部分)中,我需要将关于(无效用户/无效用户凭证)的json响应传递给我的ajax调用,我可以在View页面上提醒用户。

1 个答案:

答案 0 :(得分:6)

我很难理解问题所在,但我会尽力帮助你。

从Rails控制器渲染json的基本命令是

render json: @user
例如,

。我看到你写了类似的东西,但在某个区块内。 当你写

respond_to do |format|
  format.json { render json: @foo }
end

json渲染只会在查询的url以.json(查询的格式)结束时发生 所以这里url = user/sign_in.json将呈现json,但url = user/sign_in将假设格式为html(默认格式,您可以在路由定义中更改)并且不会呈现任何内容。

如果你需要渲染json而不管url。不要把它放在块respond_to中。如果您需要2种不同的行为,如果是ajax通话或其他通话,请使用网址foo/bar.json

如果您在rails根文件夹中运行rake routes,则会看到/users/sign_in(.:format)等网址,这意味着/users/sign_in.toto会将:format设置为toto

我希望很清楚! 如果您希望在路线中设置默认格式:

How to set the default format for a route in Rails?