link_to прохождение параметра и проблема с отображением - функция тега - Ruby on Rails - PullRequest
0 голосов
/ 15 апреля 2010

Я получил большую помощь от Кандада Боггу по моему последнему вопросу и очень, очень благодарен за это. Поскольку мы были похоронены в комментариях, я хотел разорвать эту часть.

Я пытаюсь создать тег в блоге, посвященном рельсам, который я разрабатываю. Отношение: Post has_many: теги и Tag принадлежит_to: post. Добавление и удаление тегов к сообщениям работает отлично.

В моем /view/posts/index.html.erb есть раздел под названием теги, в котором я успешно опрашиваю таблицу тегов, группирую их и отображаю счетчик рядом с именем тега (в качестве примечания я ошибочно назвал столбец, содержащий имя тега, 'tag_name' вместо просто 'name', как я должен был). Кроме того, отображение этих групп является ссылкой, которая ссылается на метод индекса в PostsController. Вот где проблема.

При переходе к / posts вы получаете сообщение об ошибке, поскольку не передается ни один параметр (без нажатия на ссылку группы тегов). У меня есть .empty? там, так что не уверен, что здесь происходит не так. Вот ошибка и код:

Error

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.empty?

/ просмотров / сообщений / index.html.erb

<% @tag_counts.each do |tag_name, tag_count| %> 
            <tr>
                <td><%= link_to(tag_name, posts_path(:tag_name => tag_name)) %></td>
                <td>(<%=tag_count%>)</td>
            </tr>
        <% end %>

PostsController

  def index
    @tag_counts = Tag.count(:group => :tag_name, :order => 'updated_at DESC', :limit => 10)
    @posts=Post.all(:joins => :tags,:conditions=>(params[:tag_name].empty? ? {}: 
                     { :tags => { :tag_name => params[:tag_name] }}
                     )
                  )

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @posts }
      format.json { render :json => @posts }
      format.atom
    end
  end

Ответы [ 3 ]

0 голосов
/ 15 апреля 2010

Когда я дал вам решение, я забыл тот факт, что обезьяна исправила мой класс Nil методом empty?. Вот почему это не работает для вас.

Измените код следующим образом:

conditions, joins = {}, nil
unless(params[:tag_name] || "").empty?
  conditions = ["tags.tag_name = ? ", params[:tag_name]]
  joins = :tags
end
@posts=Post.all(:joins => joins, :conditions=> conditions)

Редактировать 1

Приведенный выше код выполняет проверку empty вместо проверки nil. Я всегда практикую пустую проверку параметров запроса. Это охватывает случаи, когда действие вызывается из формы поиска. В таких случаях tag_name будет не нулем, а пустой строкой.

Редактировать 2

Исправлена ​​проблема с несколькими строками.

Редактировать 3

Я исправил проблему отсутствия сообщений при наличии имен тегов.

Редактировать 4

Чтобы получить счет в порядке DESC, удалите предложение order из вашего count вызова.

@tag_counts = Tag.count(:group => :tag_name, :limit => 10)

Метод count возвращает упорядоченный хеш, отсортированный по количеству. Вы изменили порядок сортировки по умолчанию, добавив предложение order.

0 голосов
/ 29 февраля 2012

Параметр, к которому вы пытаетесь получить доступ, равен нулю, а не просто пуст. Один из способов исправить это - вызвать ноль? вместо пустого? в вашем коде. Это сработало для меня:

@posts=Post.all(:joins => :tags,:conditions=>(params[:tag_name].nil? ? {}: 
                     { :tags => { :tag_name => params[:tag_name] }}
                     )
                  )
0 голосов
/ 15 апреля 2010

Здесь, где вы звоните empty?, если params[:tag_name] равно нулю, это вызовет ошибку, которую вы видите.

@posts=Post.all(:joins => :tags,:conditions=>(params[:tag_name].empty? ? {}: 
                     { :tags => { :tag_name => params[:tag_name] }}
                     )
                  )

Если вам просто важно, равен ли он нулю или нет, вы можете воспользоваться тем, что ноль - фальси, и сделать это

@posts=Post.all(:joins => :tags,:conditions=>(params[:tag_name] ? 
                     { :tags => { :tag_name => params[:tag_name] }} : {}

                     )
                  )

Но это довольно уродливо. Может быть, лучше сделать что-то подобное, чтобы прояснить, что вы делаете:

@posts = if params[:tag_name]
           Post.all
         else
           Tag.find_by_name(params[:tag_name], :include => :posts).posts
         end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...