📜  视图外的辅助路径 - Ruby (1)

📅  最后修改于: 2023-12-03 14:57:22.221000             🧑  作者: Mango

视图外的辅助路径 - Ruby

Ruby on Rails 是一个非常强大的 web 框架,它提供了很多方便的函数和辅助方法,例如 url_for, link_to, form_for 等等。这些方法通常用于视图文件中生成 HTML。除了这些方法,Rails 还提供了一些辅助方法,可以在视图外使用来方便编写代码。

url_for

url_for 是一个非常强大的方法,可以根据控制器和动作生成 URL。在视图中经常使用它来生成链接和表单。但是有时候我们需要在控制器或者其他地方使用它,比如在一个邮件模板中,你希望生成一个包含链接的邮件。

url_for(controller: 'users', action: 'index')
# => "/users"

你可以使用 url_for 可选的参数,例如 id 和 page 参数:

url_for(controller: 'users', action: 'show', id: 1, page: 2)
# => "/users/1?page=2"

url_for 也可以接受一个 Hash 对象作为参数,它会把 Hash 对象中的键值对编码成 URL 的 Query String,例如:

url_for(controller: 'users', action: 'index', params: { q: 'ruby' })
# => "/users?q=ruby"
link_to

在 Rails 应用程序中, link_to 方法用于生成超链接。通常它用于视图中的 ERB 模板中,但是如果需要在控制器或者其他地方中使用的话,可以在使用前包含它的帮助器模块。

使用 link_to 方法可以生成一个 HTML 超链接。例如:

link_to('Click here', controller: 'users', action: 'index')
# => "<a href='/users'>Click here</a>"

你也可以传递一个模型实例对象作为参数,Rails 会自动根据模型实例的路由来生成 URL。例如:

# 在 routes 中定义了 resources :users
@user = User.find(1)
link_to('User profile', @user)
# => "<a href='/users/1'>User profile</a>"

可以进一步自定义你的链接,例如指定一个样式:

link_to('Click here', controller: 'users', action: 'index', class: 'btn')
# => "<a href='/users' class='btn'>Click here</a>"
form_tag

form_tag 方法用于生成 HTML 表单。它通常用于视图模板中,但你同样可以在控制器或其他地方中使用该方法来生成一个表单。

form_tag(controller: 'users', action: 'create') do
  text_field_tag :username
  password_field_tag :password
  submit_tag 'Create'
end

# => "<form action='/users/create' method='post'><input type='text' name='username'><input type='password' name='password'><input type='submit' value='Create'></form>"

该方法接受一个字符串或 hash 做为第一个参数,第二个参数可以是一个 hash,用于生成表单元素。你可以使用 text_field_tag, password_field_tag, checkbox_tag, radio_button_tag 以及 submit_tag 等方法来生成表单元素。

除此之外,还有一些其它的辅助函数可以在视图外使用,例如:

  • capture - 在视图之外捕获渲染的结果。
  • content_tag - 生成 HTML 标签.
  • escape_javascript - 在 JavaScript 中转义字符串。
  • auto_discovery_link_tag - 生成自动发现 RSS 信息的 HTML 标签。
  • javascript_include_tag - 生成加载 JavaScript 文件的 HTML 块。

以上这些方法都可以在视图之外使用,方便我们在控制器以及其他地方使用。