Rails:未定义的局部变量或方法`params'

时间:2017-11-20 13:06:32

标签: ruby-on-rails ruby

我正在开发Rails 4.2.6应用程序。我需要将一个表参数从控制器传送到模型。这样做我收到此错误undefined local variable or method 'params'我正在尝试将下一行代码html += params[:table_data].gsub('<span class="glyphicon glyphicon-ok text-success"></span>', '&#10004;') if params[:table_data].present?转移到此代码行中的模型中:

if !element.nil?
          html += "<td class=\"soa-element text-center\" form_id=\"#{form.id}\" visit_id=\"#{visit.id}\" id=\"#{element.id}\">"
          html += params[:table_data].gsub('<span class="glyphicon glyphicon-ok text-success"></span>', '&#10004;') if params[:table_data].present?
          html += "</td>"
        else
          html += "<td class=\"soa-element\" form_id=\"#{form.id}\" visit_id=\"#{visit.id}\" id=\"0\"></td>"
        end    

上面我收到了错误,但我无法弄清楚我做错了。

下一个Pastebin是与此问题相关的模型和控制器:

https://pastebin.com/cVy9QRCy

https://pastebin.com/ApZSgYFE

如果我保持原来我的应用程序仍在工作,但我不能在控制器内部有表元素,我需要将其传递给模型。我需要了解我在做什么。

4 个答案:

答案 0 :(得分:0)

您不会将控制器中的参数传递给视图。请改用实例变量。如果在控制器中声明变量params,它将在您的视图中可用。

您需要先清除MVC概念。

答案 1 :(得分:0)

上面的答案正确地告诉你,你可能不希望这样做,但是如果你真的想这样做,那你要做的就是制作@params = the_params或以同样的方式设置一个带有@符号的变量,该变量将在您的视图中可用。

答案 2 :(得分:0)

不确定这是否有用。将变量从Controller传输到您应该使用的视图@varaible ...

如果要转移到模型,则必须在Model.rb文件中的函数内完成。

答案 3 :(得分:0)

在您的模型中,您已经有一个接收参数的方法示例,例如:

def update_state(params)
  self.update(params)
  self.reload
  self.next_state_version
  self.save
end

以及如何从控制器调用此类方法的示例:

def update_status
  find_token
  if @token.nil?
    flash[:error] = "The changes were not saved as the edit lock has timed out."
  else
    @study_version.update_state(the_params)
    AuditTrail.update_item_event(current_user, @study.identifier, @study_version.semantic_version, "Study version updated")
    @token.release
  end
  redirect_to history_study_path(@study)
end    

所以,在你的模型中,做:

def soa(params)
  ...
end

在你的控制器中:

def soa
  @study_version = StudyVersion.find(params[:id])
  render text: @study_version.soa(the_params).html_safe
end

话虽如此,我还要补充说,很多这样的逻辑和代码应该被IMO转移到服务对象和演示者中。你的控制器中有太多(再次,IMO),并将其推入你的模型并没有那么好。你只是把你的垃圾塞进另一个抽屉里。