act_as_list проблема с областью действия - PullRequest
2 голосов
/ 03 августа 2011

Проблема у меня внизу.

Модель:

class Skill
  has_many :tags  
  acts_as_list :column => 'sequence'
end

class Tag
  belongs_to :skill 
  acts_as_list :column => 'sequence', :scope => :skill
end

Вид:

<table id="skills">

  <% @skills.each do |s| %>
    <tr id="skill_<%= s.id %>">

      <td>
        <%= s.name %>
      </td>

      <td>
        <ul id="tags">
        <% s.tags.each do |t| %>
          <li id="tag_<%= t.id %>">
            <%= t.name %>
          </li>
        <% end %>
        </ul>
      </td>

    </tr>
  <% end %>

</table>

JQuery для перетаскивания:

$( "#skills" ).sortable({          
  axis: 'y',
  dropOnEmpty: false,
  handle: '.handle',
  cursor: 'move',
  items: 'tr',
  opacity: 0.4,
  scroll: true,
  update: function(){
    $.ajax({
      type: 'post',
      data: $('#skills').sortable('serialize') + "&authenticity_token=" + "<%= form_authenticity_token %>",
      dataType: 'script',
      complete: function(request){
        $('#skills').effect('highlight');
      },
      url: '<%= url_for :action => 'sort', :controller => 'skills' %>'
    })
  }
});

$( "#tags" ).sortable({          
  axis: 'y',
  dropOnEmpty: false,
  handle: '.handle',
  cursor: 'move',
  items: 'li',
  opacity: 0.4,
  scroll: true,
  update: function(){
    $.ajax({
      type: 'post',
      data: $('#tags').sortable('serialize') + "&authenticity_token=" + "<%= form_authenticity_token %>",
      dataType: 'script',
      complete: function(request){
        $('#tags').effect('highlight');
      },
      url: '<%= url_for :action => 'sort', :controller => 'tags' %>'
    })
  }
});

Контроллер для тегов:

def sort
  @tags = Tag.all
  @tags.each do |tag|
    tag.sequence = params['tag'].index(tag.id.to_s) + 1
    tag.save
  end
  render :nothing => true
end

ПРОБЛЕМА:

После перетаскивания тегов возникает ошибка:

NoMethodError (You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.+):
  app/controllers/tags_controller.rb:12:in `block in sort'
  app/controllers/tags_controller.rb:11:in `each'
  app/controllers/tags_controller.rb:11:in `sort'

Я обнаружил, что ошибка исчезла, если я загружаю теги, принадлежащие определенному навыку, например:

def sort
  @tags = Skill.find(1).tags

Вопрос - как указать контроллеру, какие теги загружать (но не все теги)?


РЕШЕНИЕ, которое Я НАШЕЛ ...

Теги контроллера:

def sort
  @tag = Tag.find(params[:tag]).first
  @skill = Skill.find_by_id(@tag.skill_id)
  @tags = @skill.tags

Это лучший способ сделать это?

1 Ответ

2 голосов
/ 03 августа 2011

Ошибка при оценке nil. +):

Это означает, что все, что должен делать params['tag'].index(tag.id.to_s) + 1 (из сортировки в контроллере), фактически приводит к nil + 1.

Если ваше решение работает должным образом, то я не вижу проблем с ним.

Как подсказка, @skill = Skill.find_by_id(@tag.skill_id) может быть сокращено до @skill = @tag.skill, если вы сделаете belongs_to :skill в своей модели Tag.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...