繁体   English   中英

不将变量发送到另一个控制器

[英]Not sending a variable to another controller

我有一个小问题:

我试图将变量从控制器1发送到控制器2,然后将其发送回控制器1。这是逻辑:

  1. 为了开始制作新模型,用户必须登录。
  2. 来宾用户还必须有权访问新模型的路径。
  3. 如果未登录,则必须重定向访客用户才能登录。
  4. 登录后,用户必须返回到他们先前尝试访问的路径。

我决定将模型的类型传递到登录屏幕,然后将其传递回新的模型操作。

变量类型通常来自路由,因此在重定向到登录屏幕时,我只是将其传递了过去。

businesses_controller.rb

before_filter :require_login 

def require_login
  unless current_user 
    redirect_to signin_path( :type => params[:type])
  end
end

重定向后,该变量将传递到我的url中-到目前为止,效果很好:

/signin?type=ccompany

当我尝试从URL中获取变量并使用其值将成功登录的用户重定向回他尝试访问的位置时,就会出现问题:

sessions_controller.rb

class SessionsController < ApplicationController
before_filter :initialize_type , :only => [:new , :create]
  def new

  end

  def create
   user = User.find_by(email: params[:session][:email].downcase)

   if user && user.authenticate(params[:session][:password])
     sign_in user
     if defined?(@type)

      redirect_to send("new_#{@type}_path")
     else
      redirect_back_or user
     end

   else
     flash.now[:error] = t('sign.invalid')
     render 'new'
   end
  end

  def destroy
    sign_out
    redirect_to root_url
  end

 private
  def initialize_type
    @type = params[:type]
  end
end

当我将@type变量放入视图时,其值呈现没有问题。 但是,当我尝试登录时,这是我得到的错误:

undefined method `new__path' for #<SessionsController:0x007f76189d42f8>

在此处输入图片说明

我也试过

redirect_to :controller => "businesses" , :action => "new" , :type => params[:type]

但是类型符号没有密钥通过。 我也尝试将变量放在那里,仍然无法正常工作。

到目前为止,只有在我写下与路径匹配的字符串时,它才起作用,但这不是我所需要的。 我需要传递params [:type]哈希值。 我已经将变量的值放在视图中,这一切都很好,但是当我尝试将其传递给函数时,其值会以某种方式“消失”。

我该如何进行这项工作?

问题是:

if defined?(:type)

它总是返回true,因为总是定义符号。 您想要的是:

if defined?(@type)

但是,这可能会在代码中添加“意外功能”,因为在ruby中定义了nil 你应该做:

if @type

注意:

I need to pass the value of the :type symbol. -符号没有价值。 变量确实具有值,符号是符号,并且它是它自己的值。

了解问题后:

以上仍然成立。

您不能将实例变量从一个动作传递到另一个动作。 对于每个请求,Rails都会实例化新的控制器实例,并且所有实例变量都将丢失。 尽管有很多方法可以通过它。

  1. 在表单中创建隐藏字段以保存值。 您需要记住,任何互联网用户只要对互联网的工作原理了解很少,就可以覆盖其价值。

  2. 在您的新操作中,只需将值写入会话中,然后在创建操作时读取它。 由于会话要么存储在服务器端,要么存储在加密的cookie中,因此任何人都可以调整它的机会很小。

好的,我找到了一种解决方法,它有点笨拙,可能会导致安全问题,但是可以用。 我强迫变量作为会话参数传递。

我在新的会话表单中将接收到的变量作为隐藏字段放置:

<%= form_for(:session , url: sessions_path ) do |f| %>

 <%= f.label  :email , t('session.email') %>
 <%= f.text_field :email %>


 <%= f.label  :password , t('session.password') %>
 <%= f.password_field :password%>

 <%= f.hidden_field :val , value: @type %> 
  #@type is set in the before filter as a variable passed from another controller

然后,在提交时,我刚刚抓到了参数并将其放在它的位置:

    if user && user.authenticate(params[:session][:password])
 sign_in user
 if defined?(@type)
   params.require(:session).permit(:val)
   @type = params[:session][:val]
  redirect_to send("new_#{@type}_path")
 else
  redirect_back_or user
 end
else
  flash.now[:error] = t('sign.invalid')
  render 'new'
end
end

现在该功能正常运行。 不幸的是,我必须将视图用作传递变量的“管道”。 如果有人为此写一个辅助方法或更好的解决方法,我将非常高兴。

干杯。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM