小编rue*_*ghn的帖子

Rails 3 app model如何确保一次只将一个布尔字段设置为true

我有一个Logo模型,其字段名称为:string,default:boolean.我希望真值是唯一的,因此数据库中只有一个项可以一次设置为true.如何在我的控制器中设置更新和新操作以将我的徽标的所有其余值设置为false?

假设我的数据库
模型徽标
名称中包含以下设置:string | 默认值:布尔值|
Item1 | 是的|
Item2 | 假|
Item3 | 假|

如果我将Item2默认值更改为true,我希望它循环遍历所有徽标并将其余徽标设置为false,因此一次只有一个是真的,所以它看起来像这样.

name:string | 默认值:布尔值|
Item1 | 假|
Item2 | 是的|
Item3 | 假|

在此先感谢您的帮助.

ruby ruby-on-rails

15
推荐指数
2
解决办法
5542
查看次数

我应该使用类方法还是实例方法,为什么?

在我的Rails应用程序中,创建业务时我有一个包含以下字段的表单:

   <%= check_box_tag(:default_company) %> 
   <%= label_tag(:default_company, "Set Company as Default") %>
Run Code Online (Sandbox Code Playgroud)

基本上当我创建一个企业时,如果他们选中此框,我需要它来运行类似下面的代码:

def set_default_company(company, user)
  exists = DefaultCompany.find(user.id)
  if exists
    exists.update_attributes(company: company)
  else  
    DefaultCompany.create(company: company, user: user)
  end
end
Run Code Online (Sandbox Code Playgroud)

在学习的过程中,我通常会在我的控制器中执行这些操作,但我正在尝试遵循最佳实践并使用胖模型,瘦控制器,所以我想要使用这样的逻辑:

def create
  @company = Company.new(params[:company])

  if @company.save
    if params[:default_company]
      Company.set_default_company(@company.id, current_user.id,)
    end
    flash[:notice] = "Company was successfully created."
    redirect_to @company
  else
    redirect_to new_company_path
  end
end
Run Code Online (Sandbox Code Playgroud)

这是我对是否使用类方法或实例方法进行调用感到困惑的地方set_default_company.他们似乎都会工作,我看不到其中任何一方的好处.

除了向我提供有关使用哪种方法的任何信息之外,如果有人可以向我展示一个简短的写作实现,作为类方法与实例方法,它可以让我更好地理解为什么.

这是我写它们的方式:

def self.set_default_company(company, user)
  # Logic here
end

def set_default_company(company, user)
  # Logic here
end
Run Code Online (Sandbox Code Playgroud)

以这种方式写它我也看不到任何好处.

ruby oop model-view-controller ruby-on-rails

7
推荐指数
1
解决办法
1万
查看次数

Ruby on Rails重定向如何在路径文件中传递params

我们最近将我们网站上的产品名称从"手镯"更改为"腕带",并且需要保留旧的路线以用于搜索引擎优化目的.

基本上,这些路线

www.hostname.com/products/bracelets/series-1/
www.hostname.com/products/bracelets/series-1/small-purple

应该路由到

www.hostname.com/products/wristbands/series-1/
www.hostname.com/products/wristbands/series-1/small-purple

我正在阅读这里的教程http://guides.rubyonrails.org/routing.html#redirection,看起来我将使用块语法,但我仍然不确定如何正确地进行路由.我也想了解更多关于路线文件的信息,所以任何信息都会很棒.提前致谢

match "/bracelets/:name" => redirect {|params| "/wristbands/#{params[:name]}" }
Run Code Online (Sandbox Code Playgroud)

编辑:

好吧,我已经玩了一会儿,这就是它如何与我尝试过的一起工作

match "/products/bracelets/:name/:name2" => redirect {|params| "/products/wristbands/#{params[:name].pluralize}/#{params[:name2].pluralize}" }
Run Code Online (Sandbox Code Playgroud)

输入网址: localhost:3000/products/bracelets/series-1/small-purple

输出URL:localhost:3000/products/wristbands
错误消息:无效的产品:series-1
(所以匹配工作,但重定向没有)

如果我更改匹配以检查这样的params:

match "/products/balance-bracelets/:name/:name2" => redirect {|params| "/products/wristbands/#{params.inspect}" }
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

 /products/wristbands/{:name=>"series-1", :name2=>"small-purple"}
Run Code Online (Sandbox Code Playgroud)

所以它似乎没有识别第二个斜杠'/'或其他东西.有任何想法吗?

ruby ruby-on-rails rails-routing http-status-code-301

4
推荐指数
2
解决办法
3812
查看次数

有人可以向我解释以下代码吗?

我跟随Rails 3 in Action一书,它正在谈论to_s模型中的覆盖.代码如下:

def to_s
  "#{email} (#{admin? ? "Admin" : "User"})"
end
Run Code Online (Sandbox Code Playgroud)

我知道在Ruby中你可以用双引号显示一个值"#{value}",但是双重问号是什么?

ruby ternary-operator

3
推荐指数
1
解决办法
639
查看次数

rails app中静态页面的最佳做法

我正在开发一个用于本地业务的ruby on rails应用程序.页面是"静态的",但可以通过我为他们构建的后端CMS进行更改.是否有为静态页面创建控制器的最佳实践?现在我有一个包含所有静态路由的站点控制器,就像这样.

的routes.rb

get "site/home"
get "site/about_us"
get "site/faq"
get "site/discounts"
get "site/services"
get "site/contact_us"
get "site/admin"
get "site/posts"
Run Code Online (Sandbox Code Playgroud)

或者我会更好地为这样的站点控制器创建成员路由,而不是因为"站点"不需要CRUD.

resources :sites, :except => [:index, :new, :create, :update, :destroy]
member do
  get :home
  get :about_us
  get :faq
  get :discounts
  get :services
  get :contact_us
  get :admin
  get :posts
end
Run Code Online (Sandbox Code Playgroud)

还是有最好的做法/更好的方法?任何答案将不胜感激.谢谢

ruby-on-rails rails-routing

3
推荐指数
1
解决办法
2332
查看次数

为什么rails应用程序意外重定向而不是匹配路由?

我之前提过这个问题并认为它是固定的,但事实并非如此.先前的问题在这里

我的问题是我试图设置我的路线,以便在我输入时

本地主机:3000 /网站/管理

应该重定向到

本地主机:3000/EN /网站/管理

这是我的routes.rb文件

scope ":locale", locale: /#{I18n.available_locales.join("|")}/ do
  get "log_out" => "sessions#destroy", as: "log_out"
  get "log_in" => "sessions#new", as: "log_in"

  resources :sites, except: [:new, :edit, :index, :show, :update, :destroy, :create]   do
  collection do
    get :home
    get :about_us
    get :faq
    get :discounts
    get :services
    get :contact_us
    get :admin
    get :posts
  end
end
resources :users
resources :abouts
resources :sessions
resources :coupons
resources :monthly_posts
resources :reviews
resources :categories do
collection { post :sort }
resources …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-routing

3
推荐指数
1
解决办法
1382
查看次数

如何在创建之前验证模型属性

这里非常基本的问题,我需要在我的Category模型上编写一个过滤器,以确保深度永远不会超过2.这是我到目前为止所拥有的.

应用程序/模型/ category.rb

before_create :check_depth
  def check_depth
    self.depth = 1 if depth > 2
  end
Run Code Online (Sandbox Code Playgroud)

我需要它而不是将深度设置为1,只是为了返回错误消息,但我甚至无法让当前的设置工作,我得到错误

undefined method `>' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

那么,而不是像我正在尝试做的那样将深度设置为一个而不是如何发送错误?任何帮助使当前功能为信息目的工作?提前致谢

ruby-on-rails

1
推荐指数
1
解决办法
4357
查看次数

需要帮助理解Ruby on Rails控制器和模型继承的语法

到目前为止,在学习Ruby和Ruby on Rails时,我一直遇到语法

ActionController::Base
Run Code Online (Sandbox Code Playgroud)

并且从未明确说明它的含义.为什么::而不是说斜线?ActionController/Base不会更具体吗?

例如,在使用Globalize3 gem时,我将该行添加到我的模型中

class About < ActiveRecord::Base
  translates :message
end
Run Code Online (Sandbox Code Playgroud)

我得到了名为MonthlyPost :: Translation的生成模型,但这并不能解释太多.这些存储到底在哪里,这意味着什么?任何想法都会很精彩.谢谢.

ruby ruby-on-rails

0
推荐指数
1
解决办法
387
查看次数