Ajax NoMethodError at / books undefined方法`[]'为nil:NilClass

时间:2017-09-24 08:43:16

标签: ruby-on-rails ajax

我目前正在尝试使用ajax,而这是我得到的错误。

  

NoMethodError at / books undefined method` []'for nil:NilClass

我的意图是,当我点击“选择”并更改值而不重新加载时,我希望书籍的卡片能够自行排序。因此,我使用js和ajax,但目前我仍然在使用它。

预订Index.html.erb

<select id="priceSelect">
  <option value="Best Results" selected="selected">Best Results</option>
  <option value="Price Descending">Price Descending</option>
  <option value="Price Ascending">Price Ascending</option>
</select>

.
.
.

<% @books.each do |book| %>
  <div class="col-xs-12 selectable-card">
    <%= link_to book_path(book.id) do %>
      ...   
    <% end %>
  </div>
<% end %>

<script>
  $('#priceSelect').change(function(){
    $.ajax({
      url: "books",
      type: "GET",
      data: {sort: $('#priceSelect :selected').val()},
      success:function(result){
        console.log(result);
      },
    })
  });
</script>

这是我的BooksController.rb

def index
  if params[:book][:title].present? && params[:users][:university].present?
    @books = Book.where({title: params[:book][:title]})
  .joins(:user).where(users: {university: params[:users][:university]})
  elsif !params[:users][:university].present? && params[:book][:title].present?
    @books = Book.where({title: params[:book][:title]})
  elsif params[:users][:university].present? && !params[:book][:title].present?
    @books = Book.joins(:user).where(users: {university: params[:users][:university]})
  else
    @books = Book.all
  end

  case params[:sort]
    when "Price Descending"
      @books.order(price_cents: "DESC")
    when "Price Ascending"
      @books.order(price_cents: "ASC")
    else
      @books.sort_by(&:created_at)
  end
end

错误表示它无法在我的控制器的索引方法中加载第一行。

def index
>  if params[:book][:title].present? && params[:users][:university].present?
    @books = Book.where({title: params[:book][:title]})
  .joins(:user).where(users: {university: params[:users][:university]})

索引本身运行正常。它可以显示我想要的所有内容,但只有当我将Select Option更改为另一个值时,页面保持不变,并在控制台中显示该错误。

最后我的routes.rb

resources :books do
  resources :users
end

1 个答案:

答案 0 :(得分:0)

我认为这一行会引发错误:

if params[:book][:title].present? && params[:users][:university].present?
    @books = Book.where({title: params[:book][:title]})
  .joins(:user).where(users: {university: params[:users][:university]})

这意味着您正在尝试访问不存在的密钥。 例如:

如果params[:book]为零,则在执行:params[:book][:title]时会出现此错误。 params[:users]params[:users][:university]相同。

检查传递的参数是否有空,可能无法从您的ajax请求中以正确的方式发送。

另外,使用dig来避免此类错误。

if params.dig("book", "title").nil? && params.dig("users", "university").nil?

您可以针对每种情况执行此操作。如果密钥为零,则dig方法不会进一步查看,这可以避免此类错误。