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

问题描述 投票:1回答:1

我按照一个教程,发现了以下内容,现在在我的 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] 从哪里获取params?唯一的路径是它从 conversation_messages_path(@conversation) 助手路径,而MessagesController的params为

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

另外,在控制器内部(第13行)... ... @messages.last.read = true; 对我来说也没有意义。我的Message类有一个布尔值,用于它的 #read 方法,但它没有保存方法,而且有一个分号,我在教程的代码中没有看到其他地方。

ruby-on-rails actionview
1个回答
1
投票

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

更多

签署 link_to 助手方法是

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

使用由选项集创建的URL创建给定名称的锚元素。请参阅文档中url_for的有效选项。也可以通过一个字符串来代替选项哈希,生成一个锚元素,使用字符串的值作为链接的href。

根据你的情况,它渲染链接到你的 messages#index 路径(当前页面)。

http:/your_host:portmessages?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将分号和换行符解释为语句的结束。然而,如果Ruby在行末遇到操作符,如+、-或反斜杠,它们表示语句的继续。

© www.soinside.com 2019 - 2024. All rights reserved.