Не могли бы вы объяснить этот синтаксис, который я нашел в учебнике? - PullRequest
0 голосов
/ 21 апреля 2020

Я следовал учебному пособию и нашел следующее, которое теперь есть в моей app/views/message/index.html.erb

<%= link_to 'Show Previous', '?m=all' %>

Я никогда раньше не видел '?m=all' часть и пытаюсь понять, как она работает .

Соответствующий контроллер в app/controllers/messages_controller.rb находится ниже

def index
    @messages = @conversation.messages
    if @messages.length > 10
      @over_ten = true
      @messages = @messages[-10..-1]
    end
    if params[:m]
      @over_ten = false
      @messages = @conversation.messages
    end
    if @messages.last
      if @messages.last.user_id != current_user.id
        @messages.last.read = true;
      end
    end

    @message = @conversation.messages.new
  end

Откуда params[:m] получает параметры? Единственный путь, который он получает, - это вспомогательный путь conversation_messages_path(@conversation), а MessagesController имеет параметры

 def message_params
        params.require(:message).permit(:body, :user_id)
    end

Кроме того, внутри контроллера (строка 13) ... @messages.last.read = true; также нет имеет смысл для меня. Мой класс Message имеет логическое значение для его метода #read, но он не сохраняет метод, и есть точка с запятой, которую я не вижу больше нигде в коде учебника.

1 Ответ

1 голос
/ 21 апреля 2020

Short

Ваша переменная m получена из параметра строки запроса.

Подробнее

Подпись link_to вспомогательный метод:

link_to (name = nil, options = nil, html_options = nil, & block)

Создает элемент привязки с указанным именем, используя URL-адрес, созданный набором вариантов. Смотрите действительные опции в документации для url_for. Также возможно передать строку вместо опций ha sh, которая генерирует элемент привязки, который использует значение строки в качестве href для ссылки.

В соответствии с вашим случаем рендеринг ссылка на ваш messages#index путь (текущая страница):

http://your_host: порт / сообщения? m = все

Вы можете переписать ваш link_to пример таким образом:

link_to 'Показать предыдущий', messages_path (m: 'all')

и результат будет таким же.

Хорошо, давайте go далее.

...
if params[:m]
  @over_ten = false
  @messages = @conversation.messages
end
...

Существует простая проверка присутствия для параметра m, поэтому, если вы измените значение all на что-то другое, например foo или blabla, результат все тот же.

Точка с запятой не нужна, потому что у вас есть просто новая строка за строкой с ней

Ruby интерпретирует точки с запятой и символы новой строки как окончание заявление. Однако, если Ruby встречает операторы, такие как +, - или backsla sh в конце строки, они указывают на продолжение оператора.

...