ror突进-render&scope的用法

render :text

这个最简单,直接render一行内容,所见即所得,用法类似,但试过

render "hell world!"

貌似是不行的,只有使用才有效果

render :text => "hell world!"

这个可以再controller里做一些临时充当的页面很方便,但是在view里面似乎就用户不大了,和直接写html代码没有区别。

render :new

一开始测之前觉得这个应该是渲染一个action,也就是执行到这里时候回跳到def new部分执行

render :new

但是测试后怀疑这里面的:new是指new.html.erb,测试方式如下,修改之前:

  # job的新建表单渲染

  def new
    @job = Job.new
  end

  # job的post操作

  def create
    @job = Job.new(job_params)
    @job.user = current_user
    if @job.save
      redirect_to jobs_path
    else
      render :new
    end
  end

此时打开new路径之后

按提交如果render的是action的话,会跳转到new那个action,所以这个时刻我把new的语句注释掉:

  # job的新建表单渲染

  def new
    # @job = Job.new

  end

如果是跳转action的话由于下面没有语句可执行,此时渲染理论上应该会报错,但是没有

所以目前初步认为这个render跳转的可能是new.html.erb,但是由于rails比较复杂所以实际原理是不是这样还是拿不准,不过最终查询官网,发现其实这个渲染的意思是同controller下的new下的template,也就是说render下面填写的还是action名,但渲染的是该action下的模板。

具体就不懂了,又不是为了科研,跳过去。。跳过去。。。

render :layout

这个是最简单的,就是选择到底默认layout哪个view模板过去

只要把默认模板放在app/view/layouts/下即可,默认走/app/views/layouts/application.html.erb
如果是app/view/layouts/adminhtml.erb的话,语法是

layout "admin"

或者

render :layout => "admin"

都行。

scope

scope很简单就是把一些数据类比如单值判断、排序等逻辑包在model中直接调用的方式,语法比较特别:

  scope :published, -> { where(published: true) }
  scope :recent, -> { order("created_at DESC") }

等,到controller中就可以直接posts.published和posts.recent直接调用即可。