gpt4 book ai didi

ruby-on-rails - rails : Passing local variables from Controller to View

转载 作者:行者123 更新时间:2023-12-01 23:55:39 24 4
gpt4 key购买 nike

我试图将局部变量从 Controller 传递到 View :

# pages_controller.rb
def my_method
render template: "pages/new_page", message: @message
end

# new_page.html.erb
<% if message %>
Do something
<% else %>
Do something else
<% end %>

但这给了我未定义的局部变量或方法 message 错误,而这在部分情况下工作正常。

我知道这可以这样解决:

def my_method
render template: "pages/new_page", locals: { message: @message }
end

我只是很想知道,如果没有局部变量,这是如何工作的。

最佳答案

这都是 render 的魔力(并不总是清晰或明确记录)的一部分。根据代码中的评论 ( github ):

If no options hash is passed or if :update isspecified, then:

If an object responding to render_in is passed,render_in is called on the object, passing in the current viewcontext.

Otherwise, a partial is rendered using the second parameteras the locals hash.

评论的最后一部分是相关的。当您使用 render 的简写形式来隐式呈现部分时,Rails 只是假设后面的散列将作为局部变量传递。所以:

<%= render 'my_partial', message: 'I hate bananas' %>

将正常工作并且 message 在您的部分中作为本地结束。

一旦您指定了一个渲染选项(具有讽刺意味的是,包括 :partial),您需要显式传递一个 locals 哈希来传递局部变量:

# BAD
render template: 'foo/bar', message: 'I hate bananas'
render partial: 'my_partial', message: 'I hate bananas'
render 'full_view', message: 'I hate bananas' # no options, but not a partial

# GOOD
render template: 'foo/bar', locals: { message: 'I hate bananas' }
render 'full_view', locals: { message: 'I hate bananas' }
render partial: 'my_partial', locals: { message: 'I hate bananas' }

(我真的不讨厌香蕉。)

这部分只是意见,但我认为在一个特定用例中的隐式局部变量不值得。我倾向于总是将部分局部变量显式包装为 :locals 以保存内存内容。另请注意,有些人会争辩说 Rails 惯例是使用实例变量来获取完整 View 而不是局部变量,但这在语法上是完全有效的。

关于ruby-on-rails - rails : Passing local variables from Controller to View,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62790451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com