我按照一个教程,发现了以下内容,现在在我的 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
方法,但它没有保存方法,而且有一个分号,我在教程的代码中没有看到其他地方。
短
您的 m
变量来自于查询字符串参数。
更多
签署 link_to
助手方法是
link_to(name = nil, options = nil, html_options = nil, &block)
使用由选项集创建的URL创建给定名称的锚元素。请参阅文档中url_for的有效选项。也可以通过一个字符串来代替选项哈希,生成一个锚元素,使用字符串的值作为链接的href。
根据你的情况,它渲染链接到你的 messages#index
路径(当前页面)。
你可以重写你的link_to例子。
link_to 'Show Previous', messages_path(m: 'all')
结果是一样的。
好了,我们再进一步。
...
if params[:m]
@over_ten = false
@messages = @conversation.messages
end
...
有一个简单的存在检查 m
参数,所以如果你改变了 all
变成另一种东西,比如 foo
或 blabla
结果还是一样的。
分号不是必须的,因为你有一个新的行和它一起的行
Ruby将分号和换行符解释为语句的结束。然而,如果Ruby在行末遇到操作符,如+、-或反斜杠,它们表示语句的继续。