我目前有以下代码片段:
<tbody>
<% @requests.each do |request| %>
<% @user = User.where(id: request[:student_id_id]).first %>
<tr>
<td><%= @user.last_name.titleize %></td>
<td><%= @user.first_name.titleize %></td>
<td><%= @user.preferred_name.titleize %></td>
<td><%= render :partial => 'documents/resumelink' %></td>
<td><%= mail_to @user.email.downcase %></td>
<% if request.allowed_companies.nil? || request.allowed_companies.empty? %>
<td> <a class="no_selected_companies_button">No Restrictions</a></td>
<% else %>
<% @allowed_request = AllowedRequest.where(professor_id_id: @current_user[:id], student_id_id: @user[:id]).first %>
<td><%= link_to("View Companies", allowed_request_path(@allowed_request) , class: "selected_companies_button") %></td>
<% end %>
</tr>
<% end %>
</tbody>
在局部视图中。文档/ _resumelink部分看起来像这样:
<% if (@document != nil) && (@document.resume_file_name != nil) %>
<%= link_to 'View Resume', @document.resume.url %>
<% else %>
<%= link_to 'No Resume available', '#' %>
<% end %>
在documents_controller中我有它所以它将是before_action set_document(没有例外)。该定义如下:
def set_document(user=@current_user)
@document = Document.find_by owner_user_id_id: user[:id]
end
所以,我希望能够做的是将@user变量传递给render:partial =&gt;中的set_document函数。 &#39;文件/ resumelink&#39;第一个视图中的行,并显示一个指向简历的链接(如果有)。
有什么想法吗?
答案 0 :(得分:2)
我认为你的问题更具系统性而非具体性;因此我想提出一些想法
<强>控制器强>
当您使用before_action
时,它会在运行Rails操作之前运行
这意味着当您向Rails发送请求时,它会加载before_action
过滤器,然后加载您请求的相关操作。部分不构成此过程的一部分:
这意味着如果您想为应用程序的不同部分提供各种变量,您需要了解它的工作原理如下:
Request -> Router -> Controller#Action -> View -> Partial
要使用适当的数据,您需要确保在上述过程的正确部分定义它。您遇到的问题是您没有这样做 - 在定义@user
变量之前,如何使@user
变量可用于方法?
现在这不是一个特定的问题;但是下次你需要记住这些事情。
<强>部分强>
如果您希望在partial中包含数据,则需要使用render
方法的locals
参数:
<%= render partial: "documents/resumelink", locals: { your_local_var: @value } %>
-
所以,我希望能够做的是将@user变量传递给我在渲染中的set_document函数
根据我上面的简单流程图,您的部分不会调用set_document
方法,因为部分只是视图的扩展名
您需要在控制器中设置@user
变量(我为您设置ActiveRecord association),然后将其作为本地传递给您的部分:
#app/models/request.rb
Class Request < ActiveRecord::Base
has_many :users, foreign_key: "student_id_id"
end
#app/models/user.rb
Class User < ActiveRecord::Base
belongs_to :request, foreign_key: "student_id_id"
end
#app/controllers/documents_conroller.rb
Class DocumentsController < ApplicationController
before_action :set_document
def index
@requests = Request.all
end
private
def set_document(user=@current_user)
@document = Document.find_by owner_user_id_id: user[:id]
end
end
这将允许您拨打以下电话:
#app/views/requests/index.html.erb
<% @requests.each do |request| %>
<% user = request.users.first %>
<%= render partial: "documents/resumelink", locals: {user: user} %>
<% end %>
答案 1 :(得分:1)
你可以这样做
<%= render :partial => 'documents/resumelink', :locals => {user => @user} %>
可以在部分中访问变量user
。
另一种方式:
可以访问变量@user
而无需对代码进行任何更改,因为它是实例变量(非本地)
答案 2 :(得分:0)
如果我理解你要做什么,我会采用不同的方式。 在视图中分配变量(尤其是实例变量)不是一个好习惯,从视图中进行数据库查询也非常糟糕。
你能做的是:
@requests = Request.where(your_conditions).includes(users: :documents)
然后我可以做一个视图
@requests.each do |request|
request.user.email
render partial: 'documents/resumelink', document: request.user.document
(实际上你已经可以做到,但上面提出的解决方案将为你节省大量的SQL查询)