[英]Not sending a variable to another controller
我有一个小问题:
我试图将变量从控制器1发送到控制器2,然后将其发送回控制器1。这是逻辑:
我决定将模型的类型传递到登录屏幕,然后将其传递回新的模型操作。
变量类型通常来自路由,因此在重定向到登录屏幕时,我只是将其传递了过去。
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都会实例化新的控制器实例,并且所有实例变量都将丢失。 尽管有很多方法可以通过它。
在表单中创建隐藏字段以保存值。 您需要记住,任何互联网用户只要对互联网的工作原理了解很少,就可以覆盖其价值。
在您的新操作中,只需将值写入会话中,然后在创建操作时读取它。 由于会话要么存储在服务器端,要么存储在加密的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.