Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 不向其他控制器发送变量_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 不向其他控制器发送变量

Ruby on rails 不向其他控制器发送变量,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我有一个小问题: 我正在尝试将一个变量从控制器1发送到控制器2,然后将其发送回控制器1。逻辑如下: 为了开始制作新模型,用户必须登录 来宾用户还必须能够访问新模型的路径 如果未登录,则必须重定向来宾用户以进行登录 登录后,用户必须返回到以前尝试访问的路径 我决定将模型的类型传递到登录屏幕,然后将其传递回新模型操作 变量类型通常来自路由,因此在重定向到登录屏幕时,我只是将其传递给它 businesss\u controller.rb: before_filter :require_login

我有一个小问题:

我正在尝试将一个变量从控制器1发送到控制器2,然后将其发送回控制器1。逻辑如下:

  • 为了开始制作新模型,用户必须登录
  • 来宾用户还必须能够访问新模型的路径
  • 如果未登录,则必须重定向来宾用户以进行登录
  • 登录后,用户必须返回到以前尝试访问的路径
  • 我决定将模型的类型传递到登录屏幕,然后将其传递回新模型操作

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

    businesss\u controller.rb

    before_filter :require_login 
    
    def require_login
      unless current_user 
        redirect_to signin_path( :type => params[:type])
      end
    end
    
    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
    
    当我被重定向时,变量被传递到我的url中-到目前为止,很好:

    /signin?type=ccompany
    
    当我尝试从URL获取变量并使用其值将成功登录的用户重定向回他尝试访问的位置时,问题出现了:

    会话\u controller.rb

    before_filter :require_login 
    
    def require_login
      unless current_user 
        redirect_to signin_path( :type => params[:type])
      end
    end
    
    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
    

    我也试过了

    redirect_to :controller => "businesses" , :action => "new" , :type => params[:type]
    
    但是类型符号传递时没有键。我还试着在那里放一个变量,但仍然不起作用

    到目前为止,它只在我写下一个匹配路径的字符串时起作用,但这不是我需要的。我需要传递params[:type]散列的值。我把变量的值放在视图中,这一切都很好,但是当我试图将它传递到函数中时,它的值不知怎么地“消失”

    我怎样才能做到这一点呢?

    问题是:

    if defined?(:type)
    
    它总是返回true,因为符号总是被定义的。你想要的是:

    if defined?(@type)
    
    然而,这可能会在代码中添加“无意的特性”,因为在ruby中,
    nil
    定义得很好。你应该做:

    if @type
    
    注:

    我需要传递:type符号的值。
    -symbol没有值。变量确实有值,符号是一个符号,它是它自己的值

    理解问题后: 上述观点仍然成立

    不能将实例变量从一个操作传递到另一个操作。对于每个请求,rails实例化新的控制器实例,所有实例变量都将丢失。但是有很多方法可以通过

  • 在表单中创建隐藏字段以保存值。你需要记住的是,任何一个对互联网工作原理了解很少的互联网用户都可以覆盖它的价值

  • 在新操作中,简单地将值写入会话,并在创建操作时读取。由于会话要么存储在服务器端,要么存储在加密的cookie中,所以任何人都很难对其进行处理

  • 问题是:

    if defined?(:type)
    
    它总是返回true,因为符号总是被定义的。你想要的是:

    if defined?(@type)
    
    然而,这可能会在代码中添加“无意的特性”,因为在ruby中,
    nil
    定义得很好。你应该做:

    if @type
    
    注:

    我需要传递:type符号的值。
    -symbol没有值。变量确实有值,符号是一个符号,它是它自己的值

    理解问题后: 上述观点仍然成立

    不能将实例变量从一个操作传递到另一个操作。对于每个请求,rails实例化新的控制器实例,所有实例变量都将丢失。但是有很多方法可以通过

  • 在表单中创建隐藏字段以保存值。你需要记住的是,任何一个对互联网工作原理了解很少的互联网用户都可以覆盖它的价值

  • 在新操作中,简单地将值写入会话,并在创建操作时读取。由于会话要么存储在服务器端,要么存储在加密的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
    
    现在该功能正常工作。不幸的是,我不得不将视图用作传递变量的“管道”。如果有人为此编写助手方法或更好的解决方法,我会非常高兴


    干杯。

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

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

    <%= 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
    
    现在该功能正常工作。不幸的是,我不得不将视图用作传递变量的“管道”。如果有人为此编写助手方法或更好的解决方法,我会非常高兴


    干杯。

    谢谢你的提示,我做了更改,但这不是我需要的,也没有解决问题。我添加了一个错误的屏幕截图,因为您可以看到@type变量的值没有被传递,尽管它已经定义并且存在。我甚至可以把它放在我的视图中。@HristoGeorgiev-如果@type而不是
    如果定义了(@type)
    ,因为nil也定义得很好。我仍然会得到错误,这意味着@type已经定义。我真的很困惑这里发生了什么。我不知道为什么rails不在create操作中发送变量。哦,我想我看到了这个问题。所以,您正在将类型传递给新操作,并尝试在创建操作中获取该类型,是否正确?是否正确。从那里,它作为变量传递给另一个控制器。我认为这可能是一个强大的参数问题,我尝试允许参数,但它没有意识到这一点。我会玩一玩。谢谢你的提示,我做了更改,但这不是我需要的,它没有解决问题。我添加了一个错误的屏幕截图,因为您可以看到@type变量的值没有被传递,尽管它已经定义并且存在。我甚至可以把它放在我的视图中。@hristogorgiev-如果@type而不是
    如果定义了它(@type)
    ,因为nil也定义得很好。我仍然会得到错误,这让我