你能解释一下我在教程中找到的这种语法吗? <%= link_to 'Show Previous', '?m=all' %>

Could you explain this syntax that I found in a tutorial? <%= link_to 'Show Previous', '?m=all' %>

我正在学习教程,发现以下内容现在在我的 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; 对我来说也没有意义。我的消息 class 有一个布尔值用于它的 #read 方法,但它没有保存该方法,并且有一个分号,我在教程代码的其他任何地方都看不到它。

您的 m 变量来自查询字符串参数。

更多

link_to 辅助方法的签名是

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

Creates an anchor element of the given name using a URL created by the set of options. See the valid options in the documentation for url_for. It’s also possible to pass a String instead of an options hash, which generates an anchor element that uses the value of the String as the href for the link.

根据您的情况,它将 link 呈现到您的 messages#index 路径(当前页面):

http://your_host:port/messages?m=all

您可以这样重写您的 link_to 示例:

link_to 'Show Previous', messages_path(m: 'all')

结果相同。

好的,让我们更进一步。

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

m 参数有一个简单的存在检查,因此如果您将值 all 更改为其他值,例如 fooblabla,结果仍然是一样。

分号不是必需的,因为你只有一个新的一行接一个

Ruby interprets semicolons and newline characters as the ending of a statement. However, if Ruby encounters operators, such as +, −, or backslash at the end of a line, they indicate the continuation of a statement.