【问题标题】:Just changed a view layout刚刚更改了视图布局
【发布时间】:2013-11-18 11:30:55
【问题描述】:

在我更改视图布局之前,Rails 会正确显示我的登录视图。 但是更改后,我在下面收到错误消息。

NilClass:Class 的未定义方法 `model_name'

在改变之前, “app/views/layouts/application.html.erb”已应用于我的登录视图。

我只想在我的登录视图上更改布局。 因此,“我制作了 app/views/layouts/login.html.erb”并将一些代码放在控制器上。 定义登录 渲染:布局 => '登录' 结束

我猜错误一定来自代码,其中包括@member。

{:action => '登录'}) 做 |f| %>

但我不明白为什么。你能给我一些建议吗?

☆成员控制器

def login
    render :layout =>'login'
    @msg = "get"
    @member = Member.new

if request.post? then
  @member = Member.new(params[:member])
  record = Member.find_by_user(params[:member][:user])
  if record == nil then
    @msg = "record is nil."
    @member.errors.add('user',"not registrated!")
  else
    if record.pass != params[:member][:pass] then
      @msg = "password is wrong."
      @member.errors.add('pass','password is wrong!')
    else 
      @msg = "good!"
      @member = record
      session[:login] = record
      redirect_to '/members/' + record.id.to_s
    end
  end
end

结束

☆layouts/login.html.erb

<!DOCTYPE html>
<html>
<head>
  <title>XXXX</title>
   <%= stylesheet_link_tag    "application", media: "all" %>
    <%= javascript_include_tag "application" %>
    <%= csrf_meta_tags %>
    <link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
 <%= render 'layouts/exheader'%> 
<div class= "container">
 <%= yield %>
</div>
<div class="container">
<%= render 'layouts/footer' %>
</div>
</body>
</html>

☆login.html.erb(会员)

    <div class="span4">
        <div class="login_form">
            <h4>Login</h4>
            <%= form_for(@member, :url => {:action => 'login'}) do |f| %>
                <% if @member.errors.any? %>
                    <div id="error_explanation">
                        <h2><%= pluralize(@member.errors.count, "error")%>
                        prohibited this member from being saved:</h2>
                        <ul>
                            <% @member.errors.full_messages.each do |msg| %>
                            <li><%=msg %></li>
                            <% end %><%# do |msg|%>
                        </ul>
                    </div>
                <% end %><%#  if%>
                <div class="field">
                    <%= f.label :user %>
                    <%= f.text_field :user %>
                </div>
                <div class="field">
                    <%= f.label :pass %>
                    <%= f.password_field :pass %>
                </div>
                <div class="actions">
                    <%= f.submit :value => "login" %>
                </div>
            <% end %><%# do |f|%>
        </div><!-- login form -->   
    </div><!--span4 for login -->   

【问题讨论】:

  • 错误出现在哪一行?
  • 这一行。 {:action => 'login'}) 做 |f| %>

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

render 发生时,Rails 将立即开始渲染视图。因此,在您的代码中,您将render :layout =&gt; 'login' 放在了动作的最开始,因此视图在执行任何动作代码之前被渲染;因此,像@member@msg 这样的所有实例变量还没有被声明,在渲染视图时它们的值是nil。所以

<%= form_for(@member, :url => {:action => 'login'}) do |f| %>
  <%# if @member.errors.any? %>

抱怨@member,这是一个nil,没有方法model_name

最终,您应该只将render 放在控制器代码的末尾。可能是这样的:

def login
  @msg = "get"
  @member = Member.new

  if request.post?
    @member = Member.new(params[:member])
    record = Member.find_by_user(params[:member][:user])
    if record.nil?
      @msg = "record is nil."
      @member.errors.add('user',"not registrated!")
    else
      if record.pass != params[:member][:pass]
        @msg = "password is wrong."
        @member.errors.add('pass','password is wrong!')
      else
        @msg = "good!"
        @member = record
        session[:login] = record
        redirect_to '/members/' + record.id.to_s
        return
      end
    end
  end
  render :layout =>'login'
end

【讨论】:

  • 先生。 Tamer Shlash,非常感谢。现在我了解了情况。但是当我将渲染放在控制器代码的末尾并尝试登录时,Rails 抱怨在此操作中多次调用渲染和/或重定向。请注意,您只能调用渲染或重定向,并且每个操作最多调用一次。另请注意,无论是重定向还是渲染都不会终止该操作的执行,因此如果您想在重定向后退出某个操作,则需要执行“redirect_to(...) and return”之类的操作。
  • @KuniharuAramaki 我编辑了答案,你现在可能想看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多