2011-03-04 80 views
0

我想从视图中的控制器设置实例变量。例如:Rails从控制器的视图设置实例变量

class UsersController 

def new 
    @admincheck = false 
end 

鉴于:home.html.erb

<%= link_to "Sign up", signup_path, @admincheck => true, :class => "signup_button round" %> 

与视图中设置@admincheck为真,将UsersController响应通过接收@admincheck是真的?

我不确定是否可以在视图中为控制器分配实例变量值。谢谢

回答

1

你不能在控制器的视图中设置实例变量。 而不是这样做,你可以传递一个参数从视图到控制器。 我想你想添加一个检查,只有管理员应该能够'注册'。 为此,您可以检查控制器中的当前用户状态并继续。

+0

谢谢,我会研究一下 – Joe 2011-03-04 20:26:33

+0

我其实希望管理员和普通用户都使用相同的表单注册。我只是想传递一些东西给控制器,让它知道这个人试图以管理员或用户身份注册,以便它可以相应地在数据库中进行记录。谢谢。 – Joe 2011-03-04 21:31:09

1

尝试使用Filters来处理这些事情。处理下一个请求的认证决定不应该是视图的责任。

你想要做什么?

+0

我有一个用户表具有布尔管理列。我希望普通用户和管理员用户使用相同的表单注册。所以,我有两个不同的注册按钮导致相同的注册表单,但我试图通过表单将@admincheck实例变量设置为true,以让控制器知道此人想成为管理员,以便设置管理员为在用户表中为特殊权限为true。谢谢 – Joe 2011-03-04 20:19:35

+0

我建议为用户和管理员用户使用不同的资源。看看rails路由系统中的命名空间。使用命名空间,您可以使用相应的控制器users_controller和admin/users_controller为routes/users/new和/ admin/users/new添加新的路径。你会得到一个干净的分离。用共享的方法和视图干你的代码。 – 2011-03-05 11:16:37

+0

非常感谢您对朱利安的投入。我会研究那 – Joe 2011-03-07 01:46:10

1

您应该简单地做这样的事情:

<%= link_to "Sign up", signup_path(:admincheck => true), :class => "signup_button round" %> 

然后在你的控制器,你可以得到admincheck@admincheck = params[:admincheck]

+0

然后@admincheck == true?我试过这个,它似乎并没有这样工作 – Joe 2011-03-04 20:52:04

1

你不能从控制器的视图设置一个实例变量。相对于请求响应周期想想:

浏览器 - >请求 - >控制器 - >查看 - >应答 - >浏览器

你想从某种看法传递给控制器​​和视图是向下行中上面的例子中它不能将一个变量传递给控制器​​,相反,您需要将数据作为表单域传递,并在Pravin和Ashihsh已经建议的控制器中捕获相同的数据。

+0

这是一个清晰和简单的解释,为什么你不能这样做。 – adg 2016-07-06 05:58:22

相关问题