首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby参数传递

Ruby参数传递
EN

Stack Overflow用户
提问于 2014-07-31 14:12:46
回答 3查看 88关注 0票数 1

我目前有以下代码片段:

代码语言:javascript
复制
 <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部分如下所示:

代码语言:javascript
复制
<% 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 (没有例外)。这个定义看起来像这样:

代码语言:javascript
复制
def set_document(user=@current_user)
  @document = Document.find_by owner_user_id_id: user[:id]
end

因此,我希望能够做的是将@user变量传递给第一个视图中render: partial =>‘documents/ resume link’行中的set_document函数,并让它显示简历的链接(如果有)。

有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2014-07-31 16:01:49

我认为你的问题是系统性的,而不是具体的;因此,我想给出一些想法

控制器

使用before_action时,它会在运行Rails操作之前运行

这意味着当您向Rails发送请求时,它会加载before_action过滤器,然后加载您请求的相关操作。分词不是这个过程的一部分:

这意味着如果你想让不同的变量对你的应用程序的不同部分可用,你需要意识到它的工作方式如下:

代码语言:javascript
复制
Request -> Router -> Controller#Action -> View -> Partial

要使用适当的数据,您需要确保在上述流程的correct_part中定义该数据。问题是您没有这样做--如何使@user变量可用于定义了@user变量的方法?

现在这对你来说不是一个特定的问题;但下次你需要记住这一点。

部分

如果您希望在partial中包含数据,则需要对render方法使用locals参数:

代码语言:javascript
复制
<%= render partial: "documents/resumelink", locals: { your_local_var: @value } %>

--

所以,我希望能够做的是将@

变量传递给呈现中的set_document函数

根据上面的简单流程图,partial不会调用set_document方法,因为partial实际上只是视图的扩展

您需要在控制器中设置@user变量(我为您设置了ActiveRecord association ),然后将其作为本地变量传递给您的partial:

代码语言:javascript
复制
#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

这将允许您调用以下代码:

代码语言:javascript
复制
#app/views/requests/index.html.erb
<% @requests.each do |request| %>
   <% user = request.users.first %>
   <%= render partial: "documents/resumelink", locals: {user: user} %>
<% end %>
票数 2
EN

Stack Overflow用户

发布于 2014-07-31 14:17:12

你可以这样做

代码语言:javascript
复制
<%= render :partial => 'documents/resumelink', :locals => {user => @user} %>

在partial中可以访问变量user

另一种方式:无需对代码进行任何更改即可访问变量@user,因为它是实例变量(不是局部变量)

票数 1
EN

Stack Overflow用户

发布于 2014-07-31 14:22:06

如果我理解你想做什么,我会用不同的方式。在视图中分配变量(特别是实例变量)不是一个好的做法,从视图进行DB查询也是非常糟糕的。

相反,您可以做的是:

代码语言:javascript
复制
@requests = Request.where(your_conditions).includes(users: :documents)

然后我看到了你可以做的

代码语言:javascript
复制
@requests.each do |request|
  request.user.email
  render partial: 'documents/resumelink', document: request.user.document

(实际上你已经可以这样做了,但是上面提出的解决方案将为你节省大量的SQL查询)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25051939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档