`
moneyinto
  • 浏览: 33708 次
  • 性别: Icon_minigender_1
  • 来自: 东台
社区版块
存档分类
最新评论

render和redirect_to

阅读更多

       简略的说,redirect_to是执行页面的跳转,发送请求重定向页面,执行对应的action,重新加载服务器数据,不保留页面原有数据;

       render是简单的页面渲染,可以指定渲染页面和布局文件,不会发送请求,不会执行action函数,不会重新加载服务器数据。

       

这里举个例子说明一下:

 

users_controller.rb:

def create_login_session
  user = User.find_by_name(params[:name])
  if user && user.authenticate(params[:password])
    cookies.permanent[:token] = user.token
    redirect_to :admin_welcome
  else
    flash[:error] = "用户名不存在或密码错误"
    redirect_to :login
  end
end

 

login.html.rb:

<div class="center-block" id="login">
  <h3>登录</h3>
  <div class="">
    <%= form_tag "/create_login_session" do %>
      <dl class="input-group">
         <dt class="input-group-addon">
            <%= label_tag "帐号" %>
         </dt>
         <dd class = "">
            <%= text_field_tag :name, params[:name], :class => "form-control" %>
         </dd>
      </dl>
      <dl class="input-group">
         <dt class="input-group-addon">
           <%= label_tag "密码" %>
         </dt>
         <dd class = "">
           <%= password_field_tag :password, params[:password], :class => "form-control" %>
         </dd>
      </dl>
      <% if flash[:error] %>
          <div class = "alert alert-danger">
             <%= flash[:error] %>
          </div>
      <% end %>
      <p> <%= submit_tag "登录", :class => "btn-default btn btm-primary" %> </p>
    <% end %>
  </div>
</div>

 

      当在登录页面输入帐号密码后点击登录,如果帐号密码不匹配,这时调用create_login_session方法就会显示flash的错误到页面,而输入的帐号和密码将会被清空,因为redirect_to重新发送了请求,重新加载了登录页面,重新获取了服务器的数据。如果这是点击浏览器的刷新按钮,也就相当于重新再执行了一次redirect_to,这时flash的内容在登录页面上也会消失,因为flash的内容缓存已经清空了。

     

       如果将redirect_to改为render:

render :login

     

       这时登录输入不正确点击登录,输入的帐号和密码的内容将还会在页面上显示,显示flash的错误到页面,此时刷新相当于render,内容一直存在页面,因为render不会发送请求,不会重新加载服务器数据,它只是渲染了页面。

 

接下来通过另一个例子深入了解一下render和redirect_to:

 

test_controller.rb:

def test1
   puts "test1_one"
   render :test1
   puts "test_wo"
end

def test2
   puts "test2_one"
   redirect_to :test2
   puts "test2_two"
end

在对应的views文件夹下有test1.html.rb和test2.html.rb

在浏览器中,test1页面显示:

test1_one

test1_two

 

test2页面会显示:

test2_one

test2_two

test2_one

test2_two

........

 

       这里总结一这个例子,在执行render或redirect_to前,def中的所有代码都会按照顺序执行一遍,比如test1页面显示了test1_two;render是渲染页面,不会发送请求,不会重新加载服务器的数据;而redirect_to是跳转到一个页面,而例子会一直循环跳转到当前页面,加载数据,导致死循环。

0
0
分享到:
评论

相关推荐

    Ruby rails 页面跳转(render和redirect_to)

    Ruby代码 代码如下:if @user.update_attributes(:password =&gt; params[:user][:password]) flash[:notice...网上找了下才发现redirect_to和render还是有很多区别的,我以前居然一点都没有注意,汗.. redirect_to实现的是

    rails 连接mysql的问题解决

    找不到指定的模块。... 您可能感兴趣的文章:Ruby rails 页面跳转(render和redirect_to)Rails link_to 详解rails常用数据库查询操作、方法浅析学习Ruby你需要了解的相关知识(rvm, gem, bundle, rake,

    采用UTF-8解决Ruby on Rails程序的中问题

    1.将.rb文件和.rhtml文件都保存为utf-8格式; 2.在/app/Controller/application.rb中增加... 您可能感兴趣的文章:Ruby rails 页面跳转(render和redirect_to)学习Ruby你需要了解的相关知识(rvm, gem, bundle, rake, rail

    flash_render:为ActionController添加了Flash支持

    允许您使用render :new, :alert =&gt; 'You messed up' ,就像您可以使用redirect_to thang, :notice =&gt; 'You made thang successfully' 。 与:notice , :alert和:flash =&gt; {:message =&gt; 'Sup foo'} ,就像redirect_...

    django 控制页面跳转的例子

    首先,我们需要了解 Django 中两种主要的页面跳转方式:`redirect()` 和 `render_to_response()`。`redirect()` 函数用于重定向到一个新的 URL,而 `render_to_response()` 用于渲染模板并返回给客户端。 在给定的...

    Python Django实现简单购物车功能

    path('add-to-cart/&lt;int:product_id&gt;/', views.add_to_cart, name='add_to_cart'), ] ``` 购物车功能的核心在于如何保存和管理用户的选择。由于Django没有内置购物车功能,我们需要自己实现。一种常见的方法是使用...

    rspec_controller_testing

    redirect_to(path or path_helper) change(Class, :count).by(num) ###设置 初始化我们的酸奶应用 $ rails new yogurt_app -T 放入 rspec-rails gem gem 'rspec-rails' 捆 bundle install 初始化 rspec $ ...

    Rails GUI Development with Ext JS 10-Jan-08 RUG-B.pdf

    format.ext_json { render :json =&gt; @post.errors.to_json, :status =&gt; :unprocessable_entity } end end end ``` #### 总结 Rails 结合 Ext JS 的方式能够极大地提高 Web 应用的开发效率。通过使用丰富的 ...

    Flask框架通过Flask_login实现用户登录功能示例

    from flask import Flask, render_template, redirect, url_for, request from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user app = Flask(__name__) login...

    Rails API 文档

    Rails 2.0中,控制器继承自ActionController基类,提供了许多方便的方法,如`redirect_to`和`render`。 3. **模型(Model)** 模型代表数据库中的数据,通过ActiveRecord库实现,允许开发者使用Ruby代码操作数据库。...

    dejavu:重定向后记住您的对象

    典型的 Rails 控制器create操作如下所示: # POST /products # POST /products.json def create @product = Product.new(params[:product]) respond_to do |format| if @product.save format.html { redirect_to @...

    django 连接数据库、上传文件

    from django.shortcuts import render, redirect from .forms import MyForm def upload_view(request): if request.method == 'POST': form = MyForm(request.POST, request.FILES) if form.is_valid(): ...

    web_并以web形式提供服务_基于python的图像转字符画_

    ascii_image = image_to_ascii(file) # 显示结果或返回URL return render_template('result.html', ascii_image=ascii_image) else: return '请选择一个图像文件' ``` 这里,我们需要创建一个`result.html`...

    Python库 | django_simple_file_handler-0.1.4.tar.gz

    file = SimpleFileField(upload_to='documents/') ``` 创建视图以处理文件上传: ```python from django.shortcuts import render from .models import Document from django_simple_file_handler.views import ...

    rails ajax提交文件或图片

    format.html { redirect_to root_path, notice: 'File uploaded successfully.' } format.js end else render :new end end private def upload_params params.require(:upload).permit(:file) end end...

    django form

    return redirect('success_url') # Redirect to a success URL else: # If the request is GET, just show the form return render(request, 'books/publisher_add.html') ``` #### 四、Django Form 类 虽然...

    rails上传文件_paperclip

    redirect_to @user, notice: 'User was successfully created.' else render :new end end private def user_params params.require(:user).permit(:name, :email, :avatar) end ``` **Paperclip的高级...

    Django文件上传

    from django.shortcuts import render, redirect from .models import FileUpload def upload_file(request): if request.method == 'POST' and request.FILES['file']: file_obj = request.FILES['file'] new_...

    【Django入门】-Django实现blog系统的附件

    file = models.FileField(upload_to='attachments/') ``` **四、数据库迁移** 创建了模型后,我们需要将它们同步到数据库。执行以下命令: ```bash python manage.py makemigrations python manage.py migrate ``...

    Django2 文件上传及下载功能(支持中文名文件)python3.7

    from django.shortcuts import render, redirect, get_object_or_404 from .models import FileModel from .forms import UploadFileForm def upload_file(request): if request.method == 'POST': form = ...

Global site tag (gtag.js) - Google Analytics