Ruby on rails 不向其他控制器发送变量
我有一个小问题: 我正在尝试将一个变量从控制器1发送到控制器2,然后将其发送回控制器1。逻辑如下: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
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实例化新的控制器实例,所有实例变量都将丢失。但是有很多方法可以通过
if defined?(:type)
它总是返回true,因为符号总是被定义的。你想要的是:
if defined?(@type)
然而,这可能会在代码中添加“无意的特性”,因为在ruby中,nil
定义得很好。你应该做:
if @type
注:
我需要传递:type符号的值。
-symbol没有值。变量确实有值,符号是一个符号,它是它自己的值
理解问题后:
上述观点仍然成立
不能将实例变量从一个操作传递到另一个操作。对于每个请求,rails实例化新的控制器实例,所有实例变量都将丢失。但是有很多方法可以通过
好的,我找到了一个解决办法。它有点笨拙,可能会导致安全问题,但它是有效的。我强制变量作为会话参数传递 我将收到的变量作为隐藏字段放入新会话表单中:
<%= 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也定义得很好。我仍然会得到错误,这让我